Android:如何防止服务崩溃后重启?

Android:如何防止服务崩溃后重启?,android,Android,有没有办法防止我的服务在“崩溃”后由ActivityManager自动重新启动?在某些情况下,我会在程序退出时强制终止我的服务,但不希望Android继续重新启动它。您的服务可以在SharedReferences中存储一个值。例如,每次服务启动时,您都可以存储类似的内容: 存储(“serviceStarted”,1) 当您的服务定期终止时(您发送消息终止),您将覆盖此值: 存储(“serviceStarted”,0) 下次服务重新启动时,它检测到serviceStarted值为“1”-这意味着您

有没有办法防止我的服务在“崩溃”后由ActivityManager自动重新启动?在某些情况下,我会在程序退出时强制终止我的服务,但不希望Android继续重新启动它。

您的服务可以在SharedReferences中存储一个值。例如,每次服务启动时,您都可以存储类似的内容: 存储(“serviceStarted”,1)

当您的服务定期终止时(您发送消息终止),您将覆盖此值: 存储(“serviceStarted”,0)

下次服务重新启动时,它检测到serviceStarted值为“1”-这意味着您的服务没有定期停止,而是自己重新启动。当您检测到这一点时,您的服务可以调用:stopSelf();取消它自己

有关更多信息:

此行为由
服务
实现中的
onStartCommand()
的返回值定义。常量
START\u NOT\u 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\u NOT\u 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;
}

展示您的服务框架实现。它是常规服务还是意向服务?如果有突出的意向,它将不起作用。我有这个问题,上述方法不起作用。下面的方法可能是一个更好的选择,但我还没有实现它。您尝试过stack overflow中建议的其他方法,但尚未成功。@BrianReinhold您的问题听起来似乎在这个问题上有特殊的转折,您是否发布了自己的一个方法来解释您的用例和您观察到的问题?我有兴趣进一步研究它。目前,我已经尝试了所有我能想到的方法来解决这个问题,这是我在堆栈溢出和其他地方发现的(我猜这是有意的,尽管我不知道)。我在create()和onStartCommand()中尝试了共享首选项、静态全局、START_NON_STICKY和stopSelf()的所有组合,但没有任何东西可以阻止系统重新启动服务。唯一的可能是我在ACTION_SHUTDOWN广播事件中停止服务。在服务的onDestroy()返回后,调用服务的onCreate并重新启动主活动。然后平板电脑将关闭。另外,如果我在ACTION_SHUTDOWN事件中没有调用stopService,一切正常,但我没有获得所需的行为(系统断电时从未调用service onDestroy。这可能是由于调用stopService()导致系统完全损坏)在事件的BroadcastReceiver处理程序中。谢谢!我需要获取频繁的位置更新并将其从服务发送到服务器。我通过基于通知的前台服务实现了这一点,但每当应用程序关闭时,它就停止接收位置更新。经过两天的努力,我找到了您的答案并调整了您的位置代码。在
stopSelf()之前
,我使用
AlarmManager
配置了相同服务的重新启动,现在延迟10秒。这很好,现在可以从服务中不断获得位置更新。非常感谢!这个解决方案的唯一问题是onCreate在onStart命令之前被调用,无法访问onCrea中的意图除非启动一个新线程并等待来自onStartCommand方法的信号,否则这可能是过分的,因为更简单的方法是将代码从onCreate移动到onStartCommand