如何在其他应用程序关闭/强制停止时以编程方式检测

时间:2013-08-23 10:29:41

标签: android

我正在开发一个Android应用程序,我需要在其他应用程序关闭/强制停止时执行操作。该检测必须从一旦启动后在后台运行的服务进行。使服务连续运行不是问题,但在其他应用程序关闭时进行检测是问题所在。请有人有任何解决方案.....

2 个答案:

答案 0 :(得分:1)

我不相信可以检测到应用程序何时被强制停止。即使被停止的应用程序也无法获取该信息。您可以使用BroadcastReceiver检测应用程序当前是否已关闭。这是一个相当不错的使用它的教程:http://saigeethamn.blogspot.com/2009/10/android-developer-tutorial-part-11.html

答案 1 :(得分:0)

当其他应用被迫关闭时,我不知道Android允许应用监听的任何官方方式。所以你必须在引擎盖下瞎逛。

免责声明:不支持此操作。虽然只是阅读信息不太可能造成任何伤害,但不能保证它会普遍起作用。如果你让它在Android的特定版本上工作,可能仍然会在不同的版本上失败。此外,Google会在每个新版本中锁定Android中的功能,因此未来的更新很可能会破坏内容。

我实际上没有尝试过下面的任何一个,因此有可能他们无法产生预期的结果。

话虽如此,这里有一些你可以试试的东西。您可能需要将它们组合起来以获得有用的东西。

过程

由于Android基于(某种程度上)修改过的Linux内核,因此它通常支持大多数Unix机制来处理进程。

应用程序由名为zygote的流程启动。在Android设备上快速运行ps会向我显示所有用户应用(以及更高级别的系统应用)似乎都是zygote进程的子级。因此,您可以获取所有进程的列表,找到zygote的PID并获取其所有子进程。

然后,您可以在每个进程上waitpid()并检查其退出状态。您可能想要尝试一下这一点,看看退出代码是否告诉您有关该过程如何结束的任何信息。

另请查看ptrace()。您可以使用zygote这样的选项直接监控PTRACE_O_TRACEFORK,这个选项基本上应该在每次启动新应用时通知您,也允许您监控其PID。

缺点:你可能需要做root才能做到这一点。 Linux不允许用户看到其他用户的进程(这是一项重要的安全功能),Android通过使用单独的Linux UID运行每个应用程序来利用(或滥用)用户模型。

的logcat

查看各种logcat应用程序(例如aLogcat),您可以监视logcat以查找以下事件:

12-26 10:01:27.670 I/ActivityManager( 774): Process org.openbmap (pid 21647) has died.

当应用程序崩溃时可能会发生一些事件 - ActivityManager会告诉您应用程序何时死亡,或者您可能会注意未处理的异常。

注意:虽然这似乎不需要root(aLogcat没有工作正常),但它可能无法在所有条件下工作。我见过aLogcat旁边没有条目的设备,但我没有调查原因。在这些情况下,上述方法不起作用,因为它依赖于能够读取logcat。