停止我的应用程序后,IntentService将被终止

我指的是android设计注意事项:AsyncTask vs Service(IntentService?)

根据讨论, AsyncTask不适合,因为它与您的Activity紧密“绑定”

所以,我启动一个Thread (我假设AsyncTask和Thread属于同一类别),在其中有一个无限运行循环并进行了以下测试。

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕。 线程仍在运行。
  • 我通过管理应用程序 – >应用程序 – >强制停止杀死我的应用程序。 线程停止。

因此,我希望在从Thread更改为Service ,即使在我退出终止我的应用程序后,我的Service也会保持活跃状态​​。


 Intent intent = new Intent(this, SyncWithCloudService.class); startService(intent); 

 public class SyncWithCloudService extends IntentService { public SyncWithCloudService() { super("SyncWithCloudService"); } @Override protected void onHandleIntent(Intent intent) { int i = 0; while (true) { Log.i("CHEOK", "Service i is " + (i++)); try { Thread.sleep(1000); } catch (InterruptedException ex) { Log.i("CHEOK", "", ex); } } } } 

  // Doesn't matter whether I use "android:process" or not.   

但是,我的发现是,

  • 退出我的应用程序,按住后退软键,直到我看到主屏幕。 服务仍在运行。
  • 我通过管理应用程序 – >应用程序 – >强制停止杀死我的应用程序。 服务已停止。

似乎ServiceThread的行为是相同的。 那么,为什么我应该使用Service而不是Thread呢? 有什么我错过了吗? 我认为即使我杀了我的应用程序,我的Service也会继续运行?

不。 当您终止应用程序时,服务将停止运行。 当你杀死你的应用程序时,它的所有组件都被杀死(活动,服务等)。

通常,线程和服务的行为是类似的。 但是,如果您从一个Activity启动一个Thread然后关闭该活动(即:退出您的应用程序),那么Android最终会注意到您的进程中没有活动组件(因为Android无法将您的Thread识别为活动组件)它会杀死你的进程,从而杀死线程。

但是,如果您正在运行服务,那么Android会注意到您正在运行服务而不是那么容易杀死它。 但是,如果没有“正在使用”,Android仍可能会终止您的服务流程。

实际上,您可以实现不同types的服务。 使用Service而不是IntentService 。 在那里你需要查看START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENT ,即使你的活动已经死亡,你也可以让你的服务在后台运行。 Android服务

您正在使用startService()Service将一直运行,直到它的代码完成,或者直到Android决定它应该被杀死。 查看绑定服务 。 在Activity.onDestroy()您应该调用unbindService()

在IntentService中,您可以覆盖返回START_REDELIVER_INTENT的onStartCommand()

然后,如果被杀死,系统会在一段时间后使用相同的Intent自动重启您的服务。

一定要在onStartCommand()上调用super实现,如下所示:

 @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent,flags,startId); return START_REDELIVER_INTENT; } 

您可以在IntentService的构造函数中调用setIntentRedelivery(true)