我希望确保即使在用户关闭应用程序(来自任务管理器或相关应用程序)后,我的服务仍在后台运行。我正在尝试实现START_STICKY
,但不知道如何正确覆盖startService
方法以允许此工作。
目前,我只是使用startService
方法启动并将LoggingIn.class
与MessagingService.class
绑定为:{/ p>
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
并确保即使在应用关闭后我的服务仍然有效或重新启动?
答案 0 :(得分:4)
您需要做的就是在START_STICKY
方法中返回onStartCommand()
标记:
@Override
public int onStartCommand (Intent intent, int flags, int startId){
// several lines of awesome code
return START_STICKY;
}
进一步考虑:
如果您使用Service
而未覆盖onStartCommand()
,则默认情况下会返回START_STICKY
,但通常由Service
运行的代码会放在onStartCommand()
中方法。
那就是它。你已经完成了,回家了。
答案 1 :(得分:0)
确保您的服务在任务管理器中被解雇后继续运行的唯一方法是将其作为前台服务:
@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 不是解决方案。