服务以 START_NOT_STICKY 重新启动

5
我有一个在后台运行的服务。如果系统因低内存条件而终止该服务,那没问题,但我不希望系统重新启动该服务。
为了实现这一点,我会从 onStartCommand 方法中返回 START_NOT_STICKY 标志,如下所示:
    public int onStartCommand(Intent intent, int flags, int startId) {

        // do stuff here

        return START_NOT_STICKY;
    }

然而,当我有意打开一系列应用程序以创建低内存条件时,日志中会出现以下内容:
    Process com.myapp (pid 3960) has died.
    Scheduling restart of crashed service com.myapp/.MyService in 5000ms
    Low Memory: No more background processes.
    ...
    Start proc com.myapp for service com.myapp/.MyService: pid=4905 uid=10031 gids={3003, 1015}

我的进程在不应该重启的情况下正在重启。为什么会这样?根据文档,START_NOT_STICKY不应允许服务重新启动。有没有其他方法来防止服务重新启动?或者我能知道何时重新启动了我的服务?

谢谢。


您确定没有任何未决定的意图会启动该服务吗?如果有未决定的意图或者您的服务处理的意图被触发,它仍然会启动。 - NuSkooler
如果触发了一个已注册BroadcastReciver的意图(例如在AndroidManifest.xml中),则服务将被启动以处理它。 - NuSkooler
BroadcastReceivers没有在清单文件中注册,而是在服务本身中注册:registerReceiver(myReceiver, new IntentFilter(MY_ID)); - Nick
我已经移除了所有的BroadcastReceivers和Listeners,但仍然存在相同的问题。 - Nick
Nick,你找到为什么会这样了吗?找到任何解决方案了吗?谢谢。 - Ahmed
显示剩余2条评论
2个回答

0

即使服务不是NOT_STICKY,也可能有多种原因需要重新启动服务:

  • 如果您的服务已绑定,使用bindService和BIND_AUTO_CREATE
  • 如果服务上有未决的意图

解决此问题的最佳方法是取消绑定服务。


0

你看过IntentService吗?它启动后会自行完成需要做的任务,然后停止自己。我用它的时候运气更好。


很遗憾,这对我的情况不起作用。我需要让服务一直运行,直到系统决定停止它的运行。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接