我没有与接收器播放的时间,还我不熟悉上面的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
返回,并且假设没有其他服务或活动,托管过程很可能会被终止,从而释放资源。
所以,我的问题:
- 如果应用程序在任务管理器(因此有一个过程)中所示,但尚未收到通知,为什么会在OS产卵的过程一个甚至没有被通知的接收者(并且可能根本没有被通知)。如果应用程序已收到通知,但该进程还没有被杀死,(因此它已列在任务管理器中),为什么操作系统在完成后不会立即杀死它?在这里,我假设任务管理器只显示一个应用程序,如果它有一个进程分配,但这会产生以下问题:
- 在任务管理器中列出接收器进程的机会是什么?即使任务管理器停止,任务管理器是否显示接收器应用程序?如果是这样,这是3.1+的新行为,以便用户可以注意到它存在并强制关闭它?如果不是的话,那么只有在
onReceive
呼叫的中间,或者在它返回并有资格被杀的时候,应用程序才应该在那里列出。根据文档,应用程序应该是一个很短的时间间隔。
在此先感谢。
感谢您的回答。对新学期+1,更明确的是停止XD。关于最后两个引号,我的意思是,除非用户有幸看到10秒内列出的应用程序。期间(或在'onReceive'返回后,但过程仍然存在)后,该应用程序不应该在那里列出,不是吗? – 2012-08-01 16:48:17
@MisterSmith:答案会因您指的第三方“任务管理器”而异。有些列出所有正在运行的进程,即使是“缓存”的空进程。有些不。这取决于任务管理器应用程序的实施者。如果您引用Android 2.x中的“正在运行的进程”列表,我会忘记它是否列出缓存进程。 – CommonsWare 2012-08-01 16:54:18