1

我没有时间玩接收器,而且我对 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返回,并且如果没有额外的服务或活动,托管进程很可能被杀死,从而释放资源。

所以,我的问题:

  1. 如果应用程序显示在任务管理器中(因此有一个进程),但尚未收到通知,为什么操作系统会为接收者生成一个甚至没有收到通知(并且可能根本没有收到通知)的进程. 如果应用程序已收到通知,但该进程尚未被终止,(因此它在任务管理器中列出),为什么操作系统不会在它完成后立即终止它?在这里,我假设任务管理器仅在分配了进程时才显示应用程序,但这会引发以下问题:
  2. 在任务管理器中列出接收器进程的可能性有多大?即使停止,任务管理器也会显示接收方应用程序吗?如果是这样,这是 3.1+ 的新行为,以便用户可以注意到它的存在并强制关闭它?如果不是,则仅当应用程序处于调用中间onReceive或返回后并且有资格被杀死时,才应在此处列出该应用程序,根据文档,这应该是一个短时间间隔。

提前致谢。

4

1 回答 1

2

所以我猜一个应用程序可以处于以下三种状态之一:停止(不在 RAM 中)、启动(在 RAM 中,未运行)、正在运行(在 RAM 中)

不完全是,至少我会这样说,尽管这可能是一个术语和/或语言问题。

进程正在运行或未运行。它不能“在 RAM 中”和“未运行”。

独立于这个概念,应用程序可以BroadcastReceivers禁用或启用其清单注册,从 Android 3.1 开始。文档将禁用状态称为“已停止”,对于 Google 而言,这是一个非常不幸的术语选择,我曾多次抱怨过。当您看到对此状态的引用时,请忽略“停止”一词的任何其他定义。实际上,您可能想为这种状态编造一些其他术语,例如“snicklefritzed”。

您的应用程序在安装后立即被 snicklefritzed。一旦某项明确运行您的组件之一(例如,用户从主屏幕手动启动活动),您的应用程序就会进入“正常”状态。当用户从设置中强制停止您的应用程序时,您的应用程序将被移回 snicklefritzed。有关应用程序是正常还是 snicklefritzed 的信息保存在某些操作系统管理的文件中,并且(AFAIK)缓存在操作系统进程中。

因此,应用程序是:

  • 没有运行(没有进程)和 snicklefritzed
  • 未运行(无进程)且未 snicklefritzed
  • 运行(有一个过程)而不是 snicklefritzed

(不可能正在运行和 snicklefritzed,因为运行某些东西的行为会使您脱离 snicklefritzed 状态,并且强制停止会终止您的进程)

当接收器不运行时,系统不会受到性能损失。

正确的。

一旦需要通知接收器,就会产生一个新的前台进程(如果尚未运行),实例化一个新的接收器,并调用 onReceive 方法。

正确的。

在 10 秒的最大处理时间后,onReceive 返回,并且如果没有额外的服务或活动,托管进程很可能被杀死,从而释放资源。

我将其表述为“托管进程有资格被杀死,并且在优先级队列中将被杀死,因为操作系统需要 RAM 用于其他进程”。

为什么操作系统会为甚至没有被通知(并且可能根本没有被通知)的接收者生成一个进程。

它没有。一个 snicklefritzed 应用程序的清单注册BroadcastReceivers被忽略。

在任务管理器中列出接收器进程的可能性有多大?

进程运行时 100%。进程未运行时为 0%。

这是 3.1+ 的新行为,以便用户可以注意到它的存在并强制关闭它?

当你说“这个”和“它”时,我不知道你指的是什么。

或者当系统有足够的可用内存时这是正常行为,即使对于 2.x 操作系统也是如此?

当你说“它”时,我仍然不知道你指的是什么。

于 2012-08-01T16:31:43.800 回答