Android应用程序及其服务在打开某些应用程序后被杀死

Posted

技术标签:

【中文标题】Android应用程序及其服务在打开某些应用程序后被杀死【英文标题】:Android app and its service being killed after open some applications 【发布时间】:2016-08-23 06:02:32 【问题描述】:

我正在开发一个应用程序来跟踪用户点击开始按钮时的位置。我实现了一项使用 LocationListener 记录位置的服务,它运行良好,但我已经进行了一些繁重的测试,当我打开一些应用程序时,我的应用程序和服务会被 android 随机杀死。

但我下载了一个名为 Wikiloc 的应用程序并进行了相同的繁重测试,打开多个应用程序这个应用程序永远不会被杀死,我看到该应用程序创建了一个无法关闭的通知。会不会和应用永远不会被系统杀死有关?

如何在我的应用中实现这一点?我必须做通知技巧吗?如果有,是如何实现的?

【问题讨论】:

您是否尝试在您的服务中使用sticky mode? @Alexander 是的,我的 onStartCommand 看起来像这样:@Override public int onStartCommand(Intent intent, int flags, int startId) Log.e(TAG, "onStartCommand"); runningService = true; super.onStartCommand(intent, flags, startId); return START_STICKY; 【参考方案1】:

查看 Android 服务的 startForeground(int, Notification) here 的文档。根据文档:

使此服务在前台运行,提供在此状态下向用户显示的持续通知。默认情况下,服务是后台服务,这意味着如果系统需要杀死它们以回收更多内存(例如在 Web 浏览器中显示大页面),可以将它们杀死而不会造成太大伤害。如果终止您的服务会对用户造成干扰,您可以设置此标志,例如您的服务正在执行背景音乐播放,这样用户会注意到他们的音乐是否停止播放。

您在 Service 的 onCreate 方法中调用 startForeground

【讨论】:

谢谢,服务现在在前台运行,它没有被 Android 杀死做一些测试,但是,我的活动被重新启动,我如何防止这种情况发生? 我不认为你可以阻止这种情况的发生(虽然不是 100% 肯定)。您可以通过将任何状态信息放入 Service(或内部存储)中来解决此问题,当 Activity 重新启动时,您可以从 Service 获取数据以填充 Activity。这会给人一种 Activity 从未被销毁的印象。 您认为 SharedPreferences 可能是存储服务状态的好方法吗? 这是一个选项。共享首选项不能很好地处理数组(列表等)(API 都是原始类型:developer.android.com/reference/android/content/…)。但是,您可以通过将数据序列化为 Json(一种特殊格式的字符串)并将状态保存为在 Activity 重新启动时将被解析的字符串来解决此问题。 谢谢,有点问题,如果系统杀掉服务,会调用服务的onDestroy方法吗?

以上是关于Android应用程序及其服务在打开某些应用程序后被杀死的主要内容,如果未能解决你的问题,请参考以下文章

Android面试题及其答案

使用 Air android 视频播放设备屏幕重新打开后黑屏

即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中

Android页面跳转协议_URL Scheme详解

(MYSQL错误解决)本地计算机上的MYSQL服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止

在某些任务杀手杀死应用程序后如何恢复android应用程序?