0

只要android设备打开,我就想在后台运行服务。我已经有一个广播接收器正在监听BOOT_COMPLETED以确保它在应该启动的时候启动,并且确实如此。但是当主要活动开始时,我想确保服务仍在运行,如果没有,则重新启动它。我对服务一开始还很陌生,所以我不确定我做得对。

在清单中,服务定义为

<service
    android:name="MyService"
    android:icon="@drawable/myicon"
    android:label="MyServiceLabel"
    android:process=":my_process">
</service>

它是从 BroadcastReceiver 开始使用的

public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, OgLogService.class);
    context.startService(service);
}

我服务的重点是

public int onStartCommand(Intent intent, int flags, int startId) {
    Timer t = new Timer();
    t.scheduleAtFixedRate(new TimerTask() {
        synchronized public void run() {
            // call web service, do stuff
        }
    }, 0, 1000 * 60);
    return Service.START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

这项服务会无限期地保持下去还是操作系统会关闭它?如果它已关闭,我的活动如何判断?如果我的活动确实需要重新启动服务,我是否需要以一种特殊的方式来确保它是一个独立的进程,不会在主要活动死亡时死亡?很抱歉有这么多问题,我只是对自己流程中的服务(以及一般服务)感到有点误导。我读到的一切都是关于服务的,而不是在他们自己的过程中。

我问是因为有一次我相信我的服务运行了多次。服务和活动不直接交互。服务写入活动读取的同一数据库。有一次,数据库中的信息似乎重复了,我认为这是由同时运行的多个服务实例引起的。

我尝试使用此答案中的代码,但它似乎不适用于在不同进程中运行的服务。在系统设置 > 应用程序 > 运行中,它显示我的应用程序正在运行 1 个进程和 1 个服务(由广播接收器启动),但该isMyServiceRunning方法返回 false 并且单步执行它似乎没有列出我的服务。

4

2 回答 2

1

无法保证您的服务将继续存在。基本上,您必须期望被杀死,然后重新启动或永远被杀死。另一件事,除非您是音频播放器,否则您不需要一直熬夜。如果您需要一直持续工作,那么您可能忘记了移动环境(电池等)有多么有限。如果您需要执行一些重复性任务,那么我建议您AlarmManager在给定的时间或间隔触发工作人员并用于IntentService实际完成工作。

于 2013-04-04T18:19:17.770 回答
0

这是一个安排您的活动的链接 http://android-er.blogspot.in/2011/05/using-alarmmanager-to-start-scheduled.html这是一个 很好的例子,您可以随时取消待处理的意图取消您的服务。

于 2013-04-04T18:29:44.757 回答