Android:保持服务运行时,应用程序被杀害

我想保持一个IntentService在后台运行,即使应用程序被IntentService 。 而通过“杀死”我的意思是长时间按Home键 – > 看到所有正在运行的应用程序 – > 划过我的应用程序 – > 应用程序死亡长时间按下后退button – > 应用程序死亡

我的代码如下。 在我的MainActivity中:

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

在我的服务中:

 public class MyService extends IntentService { @Override protected void onHandleIntent(Intent intent) { System.out.println("MyService started"); run(); } private void run() { while (true){ System.out.println("MyService still running"); doSomething(); waitSomeTime(); } } } 

我发现应用程序打开时服务正在运行。 当我通过主页button最小化应用程序时,它仍在运行。 当我通过后退closures应用程序时,它仍在运行。 但是如果我像上面提到的那样杀了它,它就会停止。 我如何解决这个问题?

如果您的服务是由您的应用程序启动,那么实际上您的服务正在主stream程上运行。 所以当应用程序被杀时服务也将被停止。 所以你可以做的是,从你的服务的onTaskRemoved方法发送广播如下:

  Intent intent = new Intent("com.android.ServiceStopped"); sendBroadcast(intent); 

并有一个广播接收机,将再次启动一项服务。 我已经尝试过了。 服务将从所有types的杀手重新开始。

里面onstart命令放在START_STICKY …这个服务不会杀了,除非它做了太多的任务,内核想杀了它…

 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("LocalService", "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } 

原因是你正在尝试使用IntentService。 以下是API文档中的一行

IntentService执行以下操作:

在处理完所有启动请求后停止服务,因此您不必调用stopSelf()。

因此,如果你想让你的服务无限期运行,我build议你扩展Service类。 但是这并不能保证你的服务将无限期地运行。 如果内存不足,您的服务仍然有可能被低内存状态的内核所杀死。因此,您有两个select:
1)通过调用startForeground()方法让它在前台运行。
2)如果服务中断,重新启动服务。 以下是文档中关于重新启动服务的示例的一部分

  public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); // For each start request, send a message to start a job and deliver the // start ID so we know which request we're stopping when we finish the job Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; mServiceHandler.sendMessage(msg); // If we get killed, after returning from here, restart return START_STICKY; } 

您可以在清单中使用android:stopWithTask="false" ,这意味着即使用户通过从任务列表中删除应用程序来终止应用程序,您的服务也不会停止。

  <service android:name=".service.StickyService" android:stopWithTask="false"/>