![](/img/trans.png)
[英]Android service crashes after app is swiped out of the recent apps list
[英]How to run an Android service in Background after it is swiped out by Recent activity?
我有一个应始终运行的后台服务。 它应该等待传入的电子邮件,当电子邮件到达(到我的旧手机)时,它将触发操作。 (向我的新手机发送短信)。 不是一个聪明的用户案例,而是学习android。
但是,如果我将应用程序保留在“最新”应用程序中,则上述所有方法都可以正常工作。 我将其滑开的那一刻不起作用。
关于如何实现此目标的任何想法?
我已经在某些应用程序(如Whatsapp,Facebook等)中看到了。即使我们滑动了,仍然有后台服务在运行,以监听新的通知等。如何使用我的应用程序实现?
为此,您需要使服务保持粘性,在服务的StartCommand上返回START_STICKY。 并在文档中提到如果进程被杀死,系统将再次重新创建
如果此服务的进程在启动时被杀死(从onStartCommand(Intent,int,int)返回之后),则将其保持在启动状态,但不要保留此传递的意图。 稍后,系统将尝试重新创建服务。 因为它处于启动状态,所以它将保证在创建新服务实例后调用onStartCommand(Intent,int,int); 如果没有任何待处理的启动命令要传递给服务,则将使用空意图对象调用该命令,因此您必须注意进行检查。
public class MyService extends Service {
/*
* (non-Javadoc)
*
* @see android.app.Service#onBind(android.content.Intent)
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.postDelayed(run, 1000);
return Service.START_STICKY;
}
private Runnable run = new Runnable() {
@Override
public void run() {
handler.removeCallbacks(run);
handler.sendEmptyMessage(0);
}
};
private Handler handler = new Handler() {
/*
* (non-Javadoc)
*
* @see android.os.Handler#handleMessage(android.os.Message)
*/
@Override
public void handleMessage(Message msg) {
Log.e("handleMessage", "" + System.currentTimeMillis());
handler.postAtTime(run, 1000);
}
};
}
为此创建粘性服务:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
START_STICKY如果此服务的进程在启动时被杀死(从onStartCommand(Intent,int,int)返回之后),则使其处于启动状态,但不保留此传递的意图。 稍后,系统将尝试重新创建服务。 因为它处于启动状态,所以它将保证在创建新服务实例后调用onStartCommand(Intent,int,int); 如果没有任何待处理的启动命令要传递给服务,则将使用空意图对象调用该命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.