我没有时间玩接收器,而且我对 2.3.x 以上的任何东西都不熟悉,所以当我读到这个问题时我完全感到困惑:
在 AndroidManifest 中注册的 BroadcastReceiver 在应用程序进程被终止时可以接收意图吗?
它的作者能够在任务管理器列表中看到 BroadcastReceiver 应用程序,当应用程序被杀死时,广播接收器不再被调用。这是由于 3.1 中引入的新机制:http:
//developer.android.com/sdk/android-3.1.html#launchcontrols
在该链接中,提到了应用程序的停止状态。文档中的任何地方都没有解释应用程序生命周期,AFAIK,所以我猜一个应用程序可以处于以下三种状态之一:
- 已停止(不在 RAM 中)
- 已启动(在 RAM 中,未运行)
- 运行(在 RAM 中)
为了让用户能够在任务管理器中看到应用程序,它应该处于启动或运行状态(我在这里猜测,因为我不知道是否还有更多状态)。并且似乎该应用程序在列表中显示了很长时间。如果接收器应用程序已启动或运行,它必须有一个带有自己的 Dalvik VM 实例的 linux 托管进程。这与我之前对接收器应该如何工作的信念相冲突:
- 当接收器不运行时,系统不会受到性能损失。
- 一旦需要通知接收器,就会产生一个新的前台进程(如果尚未运行),实例化一个新的接收器,并
onReceive
调用该方法。 - 在 10 秒的最大处理时间后,
onReceive
返回,并且如果没有额外的服务或活动,托管进程很可能被杀死,从而释放资源。
所以,我的问题:
- 如果应用程序显示在任务管理器中(因此有一个进程),但尚未收到通知,为什么操作系统会为接收者生成一个甚至没有收到通知(并且可能根本没有收到通知)的进程. 如果应用程序已收到通知,但该进程尚未被终止,(因此它在任务管理器中列出),为什么操作系统不会在它完成后立即终止它?在这里,我假设任务管理器仅在分配了进程时才显示应用程序,但这会引发以下问题:
- 在任务管理器中列出接收器进程的可能性有多大?即使停止,任务管理器也会显示接收方应用程序吗?如果是这样,这是 3.1+ 的新行为,以便用户可以注意到它的存在并强制关闭它?如果不是,则仅当应用程序处于调用中间
onReceive
或返回后并且有资格被杀死时,才应在此处列出该应用程序,根据文档,这应该是一个短时间间隔。
提前致谢。