有没有一种方法可以防止ActivityManager在我的服务“崩溃”后自动重新启动它?在某些情况下,我会在程序退出时强制终止我的服务,但不希望Android继续重新启动它。
有没有一种方法可以防止ActivityManager在我的服务“崩溃”后自动重新启动它?在某些情况下,我会在程序退出时强制终止我的服务,但不希望Android继续重新启动它。
这种行为是由您的Service
实现中onStartCommand()
的返回值所定义的。常量START_NOT_STICKY
告诉Android如果进程被“杀死”,不要重新启动服务。换句话说:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// We don't want this service to continue running if it is explicitly
// stopped, so return not sticky.
return START_NOT_STICKY;
}
HTH
以下是我想到的解决方案,希望能对其他人有所帮助。即使使用了START_NOT_STICKY
,我的应用程序仍然会重新启动。因此,我检查意图是否为null
,这意味着服务是由系统重新启动的。
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
// Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be
// restarted automatically. Unfortunately, this seems to not be the case as the log is filled
// with messages from BluetoothCommunicator and MainService after a crash when this method
// returns START_NOT_STICKY. The following does seem to work.
Log.v(LOG_TAG, "onStartCommand()");
if (intent == null) {
Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now.");
stopSelf();
}
return START_STICKY;
}
stopSelf()
之前,我使用AlarmManager
配置了同一服务的重启,延迟10秒后再次启动。这非常有效,现在可以持续从服务中获取位置更新。非常感谢! - ms_27您的服务可以在SharedPreferences中存储一个值。例如,每次服务启动时,您可以像这样存储一些内容: store("serviceStarted", 1);
当您的服务定期终止(您发送一条消息来执行此操作)时,您将覆盖此值: store("serviceStarted", 0);
下次您的服务重新启动时,它会检测到serviceStarted值为“1” - 这意味着您的服务未正常停止并重新启动。当您检测到此情况时,您的服务可以调用:stopSelf();来取消自身。
了解更多信息: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle