【问题标题】:Service restarted on Application Close - START_STICKY服务在应用程序关闭时重新启动 - START_STICKY
【发布时间】:2015-08-01 08:32:00
【问题描述】:

我有一个作为 Web 服务器运行的应用程序。该应用程序有一项服务是 START_STICKY 我希望此服务始终运行 Web 服务器(在通知中为用户提供停止它的选项)。

问题是当我关闭我的应用程序时服务器重新启动(丢失设置等)。它保持在那里很好,但 logcat 显示它正在重新启动。

我可以重新打开我的应用程序并绑定到新服务,这工作正常。虽然再次滑动关闭具有相同的效果。

我需要这个不要重新启动。

标准服务代码

private WebServerService mService;
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder binder) {
        WebServerService.MyBinder b = (WebServerService.MyBinder) binder;
        mService = b.getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
    }
};

public serviceStart() {
    mIntent = new Intent(mContext.getApplicationContext(), WebServerService.class);
    mContext.startService(mIntent);
    mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
}

服务启动

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, START_STICKY, startId);
    Log.d("SERVICE","Started");
    return START_STICKY;
}

【问题讨论】:

  • 看看@fedepaol 的这个答案 [Android 后台服务在应用程序被杀死时重新启动][1] [1]:*.com/questions/15452935/…
  • 这不是我想要的,它说的是根本不希望它重新启动!我希望它甚至不接近。不过谢谢,我认为这是我解绑后的东西。
  • 您的服务可以并且将会被系统杀死,您对此无能为力。但是,如果你有开始粘性,你会以一个空意图再次开始。重启后你必须恢复你的状态。
  • 能否提供启动服务的代码?常量 START_STICKY 意味着服务应该在关闭后重新启动。如果您不希望它在关闭后重新启动,那么 START_NOT_STICKY 将是合适的

标签: android service


【解决方案1】:

简短的回答:你不能。当系统要求内存或用户从最近的应用程序列表中刷出应用程序时,每个 Android 应用程序都可能被系统或用户杀死。这是 Android 设计,所有应用程序都必须遵守它。您可以进行的唯一(小)改进是将服务设置为Foreground service

系统认为它是用户主动意识到的,因此在内存不足时不适合杀死。 (理论上,在当前前台应用程序的极端内存压力下,服务仍然可能被杀死,但实际上这应该不是问题。)

【讨论】:

  • 感谢您的帮助。当用户滑动关闭应用程序时,startForeground() 确实会阻止服务重新启动。这就是我所追求的。我知道如果内存不足,它将重新启动,我会处理。但到目前为止,我的任何测试都没有发生这种情况。
  • 你拯救了我的一天
【解决方案2】:

使用startForeground()

缺点是您必须提供通知。

【讨论】:

    【解决方案3】:

    就像 Mimmo 说的:你不能。如果内存不足,系统确实可以杀死应用程序/服务。用户也可以这样做。使用应用程序设置中的强制关闭按钮或滑动应用程序。滑动关闭就像强制停止。关闭这样的应用程序时,应用程序/服务不会重新启动。这就是系统的工作方式。自己尝试一下,例如下载高级任务杀手并杀死 Facebook。如果您在几秒钟后重新启动高级任务杀手,您将看到 Facebook 再次运行。现在打开 Facebook 并使用滑动功能将其杀死。现在再次启动任务杀手。您会看到 Facebook 不再运行。同样,这就是系统的工作方式。 将服务设置为前台服务也无济于事。

    【讨论】:

      【解决方案4】:

      清单上的标签 android:process="anyname" 有用吗?它使服务在您应用的不同进程上运行。

      http://developer.android.com/guide/topics/manifest/service-element.html#proc

      按照其他人的规定,如果内存不足,系统仍然可以终止它,但不会通过关闭您的应用程序来终止。希望对您有所帮助。

      【讨论】: