即使应用程序被杀,我也希望在后台运行IntentService 。 并且被“杀死”我的意思是按住主页按钮很长时间 – > 查看所有正在运行的应用程序 – >将我的应用程序放在一边 – > 应用程序被杀或按下后退按钮很长时间 – > 应用程序被杀
我的代码如下。 在我的MainActivity中:Intent intent = new Intent(this, MyService.class); this.startService(intent);
在我的MyService中:
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(); } } }
我看到应用程序打开时服务正在运行。 当我通过主页按钮最小化应用程序时,它仍在运行。 当我通过后退按钮关闭应用程序时它仍在运行。 但如果我如上所述杀死它,它就会停止。 我该如何解决这个问题?
如果您的应用程序启动了您的服务,那么实际上您的服务正在主进程上运行。 因此,当应用程序被杀死时,服务也将被停止。 所以你可以做的是,从服务的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()。
因此,如果您希望您的服务无限期运行,我建议您扩展Service类。 但是,这并不能保证您的服务无限期运行。 如果内存处于低优先级状态,你的服务仍有可能被内核杀死。所以你有两个选择:
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" ,这意味着即使用户通过从任务列表中删除应用程序来杀死应用程序,您的服务也不会停止。