2012-08-01 106 views
1

我没有与接收器播放的时间,还我不熟悉上面的2.3.x版本什么,所以我完全摸不着头脑,当我读到这样一个问题:
Can BroadcastReceiver registered in AndroidManifest receive intents when application process is killed?BroadcastReceivers和内存使用情况

它的作者能够在任务管理器列表中看到BroadcastReceiver应用程序,当应用程序被终止时,不再调用广播接收器。这是由于3.1中引入了新机制:
http://developer.android.com/sdk/android-3.1.html#launchcontrols

在该链接中,提到了应用程序的停止状态。应用程序生命周期是不是在任何地方文档解释,据我所知,所以我想一个应用程序可以在这3个国家之一:

  • 停止(不是RAM)
  • 开始(在RAM中,不运行)
  • 运行(在RAM)

为了让用户能够看到在任务管理器应用程序,它应该是在启动或运行状态(我猜在这里,因为我不知道是否有更多的州)。似乎应用程序在列表中显示了相当长的时间。如果接收器应用程序已启动或正在运行,它必须拥有一个拥有自己的Dalvik VM实例的Linux主机进程。这与我之前关于接收机应如何工作的看法有冲突:

  • 当接收机没有运行时,系统没有性能损失。
  • 一旦接收者需要被通知,一个新的前台进程被产生(如果还没有运行),一个新的接收者被实例化,并且调用onReceive方法。
  • 经过10秒的最大处理时间后,onReceive返回,并且假设没有其他服务或活动,托管过程很可能会被终止,从而释放资源。

所以,我的问题:

  1. 如果应用程序在任务管理器(因此有一个过程)中所示,但尚未收到通知,为什么会在OS产卵的过程一个甚至没有被通知的接收者(并且可能根本没有被通知)。如果应用程序已收到通知,但该进程还没有被杀死,(因此它已列在任务管理器中),为什么操作系统在完成后不会立即杀死它?在这里,我假设任务管理器只显示一个应用程序,如果它有一个进程分配,但这会产生以下问题:
  2. 在任务管理器中列出接收器进程的机会是什么?即使任务管理器停止,任务管理器是否显示接收器应用程序?如果是这样,这是3.1+的新行为,以便用户可以注意到它存在并强制关闭它?如果不是的话,那么只有在onReceive呼叫的中间,或者在它返回并有资格被杀的时候,应用程序才应该在那里列出。根据文档,应用程序应该是一个很短的时间间隔。

在此先感谢。

回答

1

,所以我想一个应用程序可以在这3种状态:停止(不是RAM),指南(在RAM中,不运行),运行(在RAM)

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

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

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

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

因此,应用程序可以是:

  • 不运转(无处理)和snicklefritzed
  • 不运转(无处理),而不是snicklefritzed
  • 运行(具有工艺),而不是snicklefritzed

(这是不可能的跑步和snicklefritzed,因为运行的东西会把你移出snicklefritzed状态,并停止强制终止会终止您的过程)

当接收器没有运行时,系统没有性能损失。

正确。

一旦接收机需要通知,新的前台进程产生(如果没有运行),一个新的接收器被实例化,并且的onReceive方法被调用。

正确。

经过10秒的最大处理时间后,onReceive返回,并且没有额外的服务或活动,托管过程很可能会被终止,从而释放资源。

我会将其称为“主机进程有资格被杀死,并且在优先级队列中相对较高,因为操作系统需要内存用于其他进程”。

为什么操作系统会为接收机产生一个进程,这个接收机甚至没有被通知(可能根本没有通知)。

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

在任务管理器中列出接收器进程的机会是多少?

该过程正在运行时100%。当进程没有运行时为0%。

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

当你说“this”和“it”时,我不知道你指的是什么。

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

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

+0

感谢您的回答。对新学期+1,更明确的是停止XD。关于最后两个引号,我的意思是,除非用户有幸看到10秒内列出的应用程序。期间(或在'onReceive'返回后,但过程仍然存在)后,该应用程序不应该在那里列出,不是吗? – 2012-08-01 16:48:17

+0

@MisterSmith:答案会因您指的第三方“任务管理器”而异。有些列出所有正在运行的进程,即使是“缓存”的空进程。有些不。这取决于任务管理器应用程序的实施者。如果您引用Android 2.x中的“正在运行的进程”列表,我会忘记它是否列出缓存进程。 – CommonsWare 2012-08-01 16:54:18