Android - 当活动被销毁时服务停止

15

当我打开项目的活动时,我调用 startService(Intent intent) 方法启动一个新服务。 当活动被销毁时,服务不应该被杀死(因为我没有使用 bindService() 方法),但事实是当我关闭活动时,服务被杀死,并且一秒钟后系统创建一个新服务(我验证过了,系统再次调用我的服务的 onCreate() 方法)。我该怎么做才能只保留一个服务?谢谢。


“关闭我的活动”具体指什么? - CommonsWare
我的意思是,我按住主页按钮,然后从打开的应用程序列表中关闭我的活动。 - rickyalbert
你最终尝试了哪个解决方案??另外,你是否尝试过@Miguel的第一个解决方案,即使用android:process=":somenamehere",这对你有用吗?? - Sudhanshu Gaur
这对我有用 https://stackoverflow.com/a/45520099/1389987 - Ian M
3个回答

24
为了确保您的服务在应用程序的主进程之外独立运行,并且在它执行某些操作时,Android不会杀死它,您应该尝试做以下两件事情:
  1. 将您的服务运行在一个独立的进程中。您可以在清单文件中的服务声明中添加以下属性来实现这一点:
  2. android:process=":somenamehere"

  3. 当您的服务正在运行且您不希望其被操作系统杀死时,您必须使用 startForeground(int id, Notification notification) 方法。当服务完成所需工作后,可以通过调用 stopForeground(boolean removeNotification) 来停止前台服务。 "startForeground" 需要通知作为参数,因为每个前台服务都必须显示通知以便用户知道它正在运行。
希望这能对您有所帮助。

谢谢Miguel,第一个点对我很有帮助。在我看来,这个android:process属性并没有被很好地解释在这里。如果你没有正确设置这个属性,很难推断出一个activity.finish()会摧毁你的服务。 - jevora

6
我是说我按住主页按钮,然后从打开的应用程序列表中结束我的活动。这并不是“关闭”一个活动,而是终止了您的进程。用户可以随时使用此方法或通过第三方任务管理器应用程序终止您的进程,您无法阻止用户终止您的进程。由于您的进程也会因其他原因停止(例如,年龄过大),因此您有足够的理由处理这种情况。请注意,保留HTML标记。

但是如果用户终止了进程,我就不能让服务在后台运行了吗?我需要一个完全与我的活动无关的服务。我需要像 GPS 跟踪器一样的东西,如果用户终止了活动,我需要服务一直运行,直到用户在活动内决定停止它。 - rickyalbert
2
@rickyalbert:您的进程可能会因为用户或Android自身的原因而在任何时候被终止。这就是为什么Android提供了粘性服务,即在进程被终止后,您的服务可以在稍后重新启动。这就是您所看到的行为。您需要调整应用程序逻辑以使其与此兼容。仅仅因为希望用户通过UI停止您的服务并不意味着用户也这样想。 - CommonsWare
我发现像谷歌的MyTracks这样的应用程序可以在运动时跟踪您的 GPS 位置,如果您终止进程,该应用程序将继续跟踪您的位置(有一个提醒通知),只有在返回活动并停止它时才能停止服务。 - rickyalbert
4
@rickyalbert说:"该应用程序会持续追踪您的位置(会有一条提醒通知)",他们正在使用startForeground()。"只有在返回到活动并停止它时,您才可以停止服务"——有许多方法可以让用户停止前台服务,其中大多数不涉及"返回到活动并停止它"。 - CommonsWare
1
@Saman:在Android中,按下HOME按钮并不会“终止”任何东西。这相当于在桌面操作系统中最小化一个窗口。 - CommonsWare
显示剩余2条评论

0

编辑:请参考CommonsWare的答案

旧回答:您应该重写public int onStartCommand(Intent intent, int flags, int startId)方法,并返回START_STICKY值作为服务的模式。

这将使您的服务在活动被销毁或甚至退出应用程序时继续工作,除非您明确调用stopService(Intent)


我按照你说的做了,但是我遇到了同样的问题,服务在完成后一秒钟重新启动。 - rickyalbert
1
我在我的服务的onCreate()方法中添加了'startForeground()',解决了我的问题,谢谢,我会再看一下。 - rickyalbert
@Payam,你为什么认为START_STICKY不再是解决方案了? - Sudhanshu Gaur

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