我正在开发一个 android 应用程序,当其他应用程序关闭/强制停止时,我需要在其中执行操作。必须从启动后在后台运行的服务进行此检测。让服务持续运行不是问题,但在其他应用程序关闭时进行检测是问题。请问有人有什么解决办法吗.....
2 回答
我不相信有可能检测到应用程序何时被强制停止。即使是被停止的应用程序也无法获得该信息。您可以使用 BroadcastReceiver 检测应用程序当前是否已关闭。这是一个相当不错的使用教程: http: //saigeethamn.blogspot.com/2009/10/android-developer-tutorial-part-11.html
我不知道Android允许应用程序在其他应用程序被迫关闭时监听的任何官方方式。所以你必须在引擎盖下四处寻找。
免责声明:不支持这样做。虽然仅仅阅读信息不太可能造成任何伤害,但不能保证它会普遍适用。如果你让它在你的特定版本的 Android 上工作,可能仍然会在不同的版本上失败。此外,谷歌在每个新版本中都会锁定 Android 中的功能,因此未来的更新很有可能会破坏一些东西。
我实际上没有尝试过以下任何一种方法,因此它们有可能无法产生预期的结果。
话虽如此,这里有一些你可以尝试的事情。您可能需要将它们组合起来以从中获得有用的东西。
流程
由于 Android 基于(稍微)修改过的 Linux 内核,它通常支持大多数 Unix 机制来处理进程。
应用程序由一个名为zygote
. 在 Android 设备上的快速运行ps
告诉我,所有用户应用程序(以及更高级别的系统应用程序)似乎都是该进程的子zygote
进程。因此,您可以获得所有进程的列表,找到 PIDzygote
并获取其所有子进程。
然后,您可能能够waitpid()
对每个进程进行检查并检查其退出状态。您可能想尝试一下,看看退出代码是否告诉您有关该过程如何结束的任何信息。
也看看ptrace()
。您可能可以zygote
使用诸如 之类的选项直接进行监控PTRACE_O_TRACEFORK
,基本上每次启动新应用程序时都会通知您,也允许您监控其 PID。
缺点:您可能需要成为 root 才能执行此操作。Linux 不允许用户查看其他用户的进程(这是一项重要的安全功能),并且 Android 通过使用单独的 Linux UID 运行每个应用程序来利用(或滥用)用户模型。
日志猫
查看各种 logcat 应用程序(例如 aLogcat),您可能能够监视 logcat 中的以下事件:
12-26 10:01:27.670 I/ActivityManager( 774): Process org.openbmap (pid 21647) has died.
当应用程序崩溃时可能会发生一些事件——ActivityManager 会告诉您应用程序何时死亡,或者您可能会注意未处理的异常。
注意:虽然这似乎不需要 root (没有 aLogcat 也可以正常工作),但它可能无法在所有条件下工作。我见过 aLogcat 几乎看不到任何条目的设备,尽管我没有调查原因。在这些情况下,上述方法将不起作用,因为它取决于能够读取 logcat。