activity 关闭时服务停止

Service stops when activity is closed

我看了很多关于这个问题的答案,它们似乎都是一样的:

"Run your service with START_STICKY"
"Run your service in the foreground"
"Run your service with startService and don't bind it"

我正在做所有这些事情,每次我的 activity 关闭时,我的服务仍然会关闭并重新启动。

这不是 IntentService。 除了在 onClick 处理程序中,我也不会在任何地方调用 stopSelf 或 stopService。

请向下滚动到我的更新 - 此行为已被确认为 android OS 中的错误,我已将其报告给 google。 Click here to view the report.

从 MainActivity 启动我的服务:

svcIntent = new Intent(getBaseContext(), MyService.class);
startService(svcIntent);

在我的 onStartCommand 中:

        // Enter foreground state
    String title = "Service has been started...";
    String subject = "Service is running...";
    String body = "Monitoring your battery usage.";
    Notification notification = new Notification(R.drawable.theicon, title,
            System.currentTimeMillis());
    if (prefs.getBoolean("notificationSounds", true))
        notification.defaults |= Notification.DEFAULT_SOUND;
    else
        notification.sound = null;
    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent pendIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.setLatestEventInfo(this, subject, body, pendIntent);
    startForeground(1500, notification);

在我的 onStartCommand 结束时:

...
// Release WakeLock
wl.release();

    return START_STICKY;

更新

我知道是什么原因造成的!但我不知道如何解决它。在我的服务中,我还在我的服务中使用了一个 AlarmManager 来设置在指定时间间隔内对服务的函数调用。

        // Alarm manager setup for MyService
    AlarmManager AM = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    svcIntent1 = new Intent(this, AlarmReceiver.class);
    prefs.edit().putInt("initialBatt", initialBatt).apply();
    svcIntent1.setAction("com.myApp.servicealarm");
    pendingIntent = PendingIntent.getBroadcast(this, 93, svcIntent1, PendingIntent.FLAG_UPDATE_CURRENT);

    // Set the alarm
    AM.set(AlarmManager.RTC_WAKEUP, timeNow + waitTime, pendingIntent);

我注意到,如果我不注释掉设置闹钟的 AM.set 调用,即使 onReceive 是空的,我的服务也会在闹钟响起时被终止,最近我将我的应用程序刷掉了应用。如果我注释掉设置的警报调用,那么在我关闭我的应用程序后,该服务永远不会被终止并保持 运行 。有没有搞错?!我的算法功能需要这个警报!!

这很奇怪。一旦警报响起,我的调试消息就不会打印出来,我的服务就会重新启动。但是第二次,服务重启后,确实打印了调试信息,程序执行成功。

我已经试过了,它仍然会发生在普通的广播接收器上。我还将我的代码精简为仅来自我的服务和广播接收器的设置警报呼叫,并且发生了同样的事情,所以这不是我的算法。显然,如果您有设置警报的前台服务,当警报关闭时您的服务会重新启动。

CLOSING

此行为似乎是由 android OS 中的错误引起的,因此我不希望得到答复。如果您想亲自查看此错误,click here。我提供了一个项目,您可以使用它来编译和重现问题。

尝试 运行 在单独的进程中使用您的服务。像这样在您的清单中定义它:

<service
   android:name=".path.to.service.class"
   android:process=":my_service"/>

Android 在发送广播 Intent 时终止进程 (在您的应用程序中 received/processed 之前).

从 4.4 (API 19) 开始,这是一个严重的 Android 错误。

https://code.google.com/p/android/issues/detail?id=63618&can=1&q=service%20restart%20broadcast&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

尤其是评论 #22 和 #23

不幸的是,几乎所有 "open" 问题最近都被标记为 "obsolete",假设它们都已在 Android 5.0 中修复。开发人员无法重新打开 "obsolete" 问题。


编辑:添加有关前台广播的详细信息

根据链接问题中的信息,似乎将 Intent.FLAG_RECEIVER_FOREGROUND 添加到您的广播 Intent 将确保该进程不会在下一次收到广播时被杀死 Intent

为此,添加:

svcIntent1.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

到您在 AlarmManager 中设置闹钟的代码。

有关详细信息,请阅读链接问题中的评论。