在Recent活动刷出后,如何在后台运行Android服务?

时间:2015-01-22 10:29:04

标签: android background-service android-intentservice

我有一个应该始终运行的后台服务。 它应该等待即将发送的电子邮件,当电子邮件到达时(对我的旧手机),它将触发一个动作。 (将短信发送到我的新手机)。不是一个聪明的用户案例,而只是学习android。

但是,如果我将应用保留在“最近的”应用中,以上所有工作正常。我擦掉它的那一刻,它不起作用。

关于如何实现这一点的任何想法?

我在Whatsapp,Facebook等应用程序中看到过,即使在我们刷掉之后,还有一个后台服务正在运行以收听新的通知等。 我如何用我的应用程序实现?

2 个答案:

答案 0 :(得分:1)

为此,您需要在服务的StartCommand上进行服务粘性返回START_STICKY。并且在文档中,如果进程被杀死,系统将再次重新创建

  

如果此服务的进程在启动时被终止(之后)   从onStartCommand(Intent,int,int)返回,然后将其留在   开始状态,但不保留这个交付的意图。后来的系统   将尝试重新创建服务。因为它处于启动状态,   它将保证在之后调用onStartCommand(Intent,int,int)   创建新的服务实例;如果没有任何未决的开始   要传递给服务的命令,将使用null调用它   意图对象,所以你必须注意检查这个。

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);
        }

    };
}

答案 1 :(得分:0)

为此创建粘性服务:

@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);如果没有任何待处理的启动命令要传递给服务,则将使用空的intent对象调用它。