Android:保持服务运行,在应用关闭时停止(已从应用托盘中删除)

时间:2019-01-10 02:57:30

标签: android service

我有一个定位服务,我想在应用程序处于前台或后台时始终运行,但是在应用程序关闭(从应用程序托盘中删除)时停止运行。

我的解决方案是使用START_NOT_STICKY启动服务,这似乎可行,但是我对服务文档中有关此命令的内容感到担忧

  

START_NOT_STICKY说,从onStartCreated()返回后,如果进程被杀死而没有剩余的启动命令要交付,则该服务将停止而不是重新启动。对于仅在执行发送给它们的命令时运行的服务,这更有意义。例如,可以每15分钟从警报启动一项服务以轮询某些网络状态。如果在执行此操作时将其杀死,最好是将其停止并在下次警报响起时启动。

因此,似乎在内存不足时Android可能会终止服务,并且如果使用START_NOT_STICKY,服务将不会重新启动。

我尝试使用START_STICKY,但这即使关闭了应用程序也能保持服务运行。

我应该怎么做才能使服务始终在前台或后台运行,并在关闭后停止运行,而又不必担心Android在运行时终止它?

请在此处输入代码

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    if (intent != null) {
        extras = intent.getExtras();

        // takes the messenger object and makes it local so when the messagereceiver sends an intent here, it won't overwrite the extras object
        // and get rid of the messenger. Otherwise, getting an update from the notification controls would null out the messenger object
        if (intent.hasExtra("MESSENGER")) {
            Timber.e("MESSENGER ");
            messenger = (Messenger) extras.get("MESSENGER");
        }
    }
    return START_NOT_STICKY;
}

1 个答案:

答案 0 :(得分:1)

  

我应该怎么做才能使服务始终在前台或后台运行,并在关闭后停止运行,而又不必担心Android在运行时终止它?

我不确定您指的是什么“应用程序托盘”,或者“封闭”到底是什么意思(Android应用程序本身不是“封闭”的东西。

但是,根据您的描述,我认为您想做类似的事情:

  • 在用户启动您的应用程序时启动您的服务,并在活动处于前台时进行绑定
  • 如果您的活动已暂停(或停止),请取消与该服务的绑定并启动前台通知以使该服务保持活动状态,并使用户知道该服务仍在运行
  • 不是试图检测应用程序何时“关闭”(您实际上无法做到),而是将“取消”操作附加到前台通知,以便用户可以在需要时取消它

如果这不能解决您的问题,请详细说明您的用例以及为什么要这样做。我或其他人也许可以提供更多/更好/替代性建议,其中包含有关您最终实际要实现的目标的更多细节。

希望有帮助!