当用户滑开时前台服务被终止

Posted

技术标签:

【中文标题】当用户滑开时前台服务被终止【英文标题】:Foreground service killed when user swypes away 【发布时间】:2013-08-04 00:53:02 【问题描述】:

正如标题所说,我遇到了以下问题。当启动它的活动从最近的任务列表中消失时,我的前台服务被杀死了。 我正在开始一项服务

    @Override
public int onStartCommand(Intent intent, int flags, int startId) 
    startForeground(notificationID, notification);
    return START_STICKY;

有人可以告诉我为什么会发生这种情况,我该如何做到这一点,以便在用户将活动扫开时服务保持运行。

由于某种原因,我无权访问 public void onTaskRemoved (Intent rootIntent),但我不知道在该方法中该怎么做...

我正在启动这样的服务,它不是绑定服务

serviceIntent = new Intent(this, RecordingService.class);
startService(serviceIntent);

如果用例描述很少有帮助,我正试图从通知栏中的远程视图控制录音机,因此重启服务不是一种选择,因为即使活动被破坏,它也应该继续记录。

顺便说一句。我确实尝试通过 android:process=":recordingProcess" 在另一个进程中启动服务,然后该服务确实继续运行,但我怀疑这不是你应该这样做的方式。

【问题讨论】:

相关:In android 4.4, swiping app out of recent tasks permanently kills application with its service . Any idea why? 【参考方案1】:

即使我遇到了同样的问题,我也可以访问onTaskRemoved() 功能。请查看this 链接,“流程生命周期”主题。 尝试从onStartCommand()START_REDELIVER_INTENT返回,服务会重新启动。

【讨论】:

感谢您的建议,这似乎很有希望,因为我也相信可能有一些应该使用的标志,但是当我返回它时它也不起作用。顺便提一句。你知道为什么我不能访问 onTaskRemoved 吗,它没有在文档中列出最低 api 级别,所以应该可用。 不,它应该可以工作,但是重新启动服务需要一些时间(最多可能是 1 o 2 分钟)。实际上它对我有用!是的,您可以从 API 14 访问 onTaskRemoved 。 不,它不适用于装有 Android 4.1.2 的 Galaxy S2。此外,我真的需要它不要停止,因为我正在该前台服务中录制音频并从远程视图(通知)控制录制过程 您是否使用 startForeground() 进行通知? 来自 android 参考:启动的服务可以使用 startForeground(int, Notification) API 将服务置于前台状态,系统认为它是用户主动意识到的,因此内存不足时不适合杀死。 (理论上,在当前前台应用程序的极端内存压力下,服务仍然可能被杀死,但实际上这不应该是一个问题。)【参考方案2】:

来自Android Developer Reference

服务既可以启动,也可以绑定连接。在 在这种情况下,系统将保持服务运行,只要 它要么已启动,要么与它有一个或多个连接 Context.BIND_AUTO_CREATE 标志。一旦这两种情况都没有 持有,服务的 onDestroy() 方法被调用,服务是 有效终止。

您是如何开始服务的?

【讨论】:

是的,知道这一点也很有用。我没有使用绑定服务,而是使用 serviceIntent = new Intent(this, RecordingService.class); 启动它startService(serviceIntent);

以上是关于当用户滑开时前台服务被终止的主要内容,如果未能解决你的问题,请参考以下文章

前台服务已终止且未重新启动

android前台服务以及通知

Android - 前台和后台服务有啥区别?

当应用程序切换到后台时,我的 android 位置服务被终止

前台服务在执行互联网相关操作时被杀死

一段时间后,前台服务被Android杀死