如何在服务中设置 START_STICKY

How to setup START_STICKY in service

我希望确保我的服务即使在用户关闭应用程序(从任务管理器或相关应用程序)后也能在后台运行。我正在尝试实施 START_STICKY 但不知道如何正确覆盖 startService 方法以使其正常工作。

目前我只是简单地使用startService方法来启动和绑定LoggingIn.classMessagingService.class如:

startService(new Intent(LoggingIn.this, MessagingService.class));

我研究过 onStartCommand 方法是实现 START_STICKY 的常用位置,但我没有发现我的应用程序需要它,因为服务启动后我会绑定所有其他方法类 给它:

private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        imService = ((MessagingService.IMBinder) service).getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        imService = null;
        Toast.makeText(GroupMessaging.this, R.string.local_service_stopped,
                Toast.LENGTH_SHORT).show();
    }
};

    bindService(new Intent(GroupMessaging.this, MessagingService.class),
            mConnection, Context.BIND_AUTO_CREATE);

如何正确实施 START_STICKY 并确保即使在应用程序关闭后我的服务仍保持活动状态或重新启动?

您需要做的就是 return onStartCommand() 方法中的 START_STICKY 标志:

@Override
public int onStartCommand (Intent intent, int flags, int startId){

    // several lines of awesome code

    return START_STICKY;
}

进一步考虑:

如果您使用 Service 而不覆盖 onStartCommand(),它默认 returns START_STICKY,虽然通常代码 运行 由 Service 放在 onStartCommand() 方法中。

就是这样。完了,回家吧。

在任务管理器中关闭后确保您的服务继续运行的唯一方法是将其设为前台服务:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    startForeground(ONGOING_NOTIFICATION_ID, notification);

    return  super.onStartCommand(intent, flags, startId);
}

阅读此处:https://developer.android.com/guide/components/services.html#Foreground

单独返回 START_STICKY 不是解决方案。