如何找出android OS是不是停止服务

Posted

技术标签:

【中文标题】如何找出android OS是不是停止服务【英文标题】:How to find out if android OS is stopped Service如何找出android OS是否停止服务 【发布时间】:2020-03-29 00:09:22 【问题描述】:

我已经使用 android***Service 编写了一个 ***,它运行良好。当我运行它时,它会创建一个前台服务并通过我的 *** 服务器发送所有流量。它还具有内部重新连接机制,可在 *** 服务器因任何原因断开连接时重新连接而不停止服务本身。

我喜欢让这个 *** 服务一直工作。但我的问题是,这个 *** 服务在完全随机的一段时间后偶尔会停止(有时只需要 10 分钟,但有时它会在停止前工作 2-3 天)。

由于停止时间是完全随机的,而且我在代码中找不到任何会造成这种情况的地方(我已经调试了数周),我想可能是 android OS 本身出于某种原因停止了我的***Service。我想知道是否有办法检测系统是否从外部停止了我的服务。有什么想法吗?

【问题讨论】:

【参考方案1】:

不幸的是,Android OS 仍然可以在内存不足和其他可能的情况下终止服务,即使它是后台运行的服务!

不仅是 Android,所有移动操作系统都通过杀死后台应用程序来优化 RAM 使用率。

这样做是为了让前台应用程序获得最高优先级。它可确保当前应用程序的平稳运行并减少系统负载。

本文中提到了两种方法: Background Service getting killed in android

如果您正在实施服务,请覆盖 onStartCommand() 和 返回 START_STICKY 作为结果。它会告诉系统,即使 如果由于内存不足而想要终止您的服务,它应该 内存恢复正常后立即重新创建它。 如果您不确定第一种方法是否有效 - 您必须使用 报警管理器 http://developer.android.com/reference/android/app/AlarmManager.html .那是一个系统服务,它将在您需要时执行操作 告诉,例如定期。这将确保如果您的服务 将被终止,甚至整个进程都会死掉(例如 强制关闭)- 它将由 AlarmManager 100% 重新启动。

我以前遇到过这个问题,我已经通过创建永久运行的服务来解决它,即使它被手动终止或从它自己重新创建的系统中终止。

【讨论】:

正如我在帖子中提到的,我已经将我的服务置于前台并且它已经返回 START_STICKY。对于AlaramManager,我不确定是否可以将它用于***Service,因为它在某种程度上是一项特殊服务。所以我的主要问题是我如何才能发现 Service 因任何原因(例如内存不足)而被杀死了我的系统。

以上是关于如何找出android OS是不是停止服务的主要内容,如果未能解决你的问题,请参考以下文章

如何获得在android中停止服务的意图

如何在 Android 中停止重复警报服务?

Kivy:从主应用程序停止 android 服务

android的停止后台服务

如何停止以自定义意图启动的 Android 服务

idea停止tomcat服务器如何一次停止