如果应用程序进程被杀死,bundle如何发送到onCreate方法?

3
在Activity生命周期图中,有一个从“onStop”到“App进程被杀死”再到“onCreate”的箭头。我一直在想,现在我要做一个关于片段的小讲座;如果整个应用程序进程被销毁,如何使onCreate接收来自onStop的bundle呢?系统是否会跟踪已杀死的应用程序及其活动包?我认为这就是它的实现方式,因为此时被杀死的应用程序将没有任何内存分配给它。
另外,在页面“管理Activity生命周期>启动Activity”的最后一段中,“除了以下情况之外,系统在调用了所有情况下的onPause()和onStop()之后才调用onDestroy():...”而该情况并未说明是低内存。这使我认为箭头不应该从onStop指向onCreate,因为“具有更高优先级的应用需要内存”。这是一个错别字还是我的理解有误?我觉得是我的理解有误,因为在“通常情况下,活动生命周期的移动看起来像这样:”图表中有一个“可杀死?”列。
这两者中必定有一个是错误的,无论是活动生命周期图中的箭头还是“除了以下情况之外,系统在调用了所有情况下的onPause()和onStop()之后才调用onDestroy()”语句。希望我没有理解错上下文。
2个回答

5
如果整个应用程序进程已被销毁,怎么可能让onCreate从onStop接收bundle?
实际上,它并不会“从onStop接收bundle”,因为onStop()和Bundle没有任何关系。传递给onCreate()和onRestoreInstanceState()方法的Bundle包含先前由onSaveInstanceState()方法放入的数据。该Bundle的内容跨越进程边界传递到管理未完成活动及其任务状态的核心操作系统进程。如果相关,该内容将传递回您的应用程序的新进程。
系统是否会跟踪已关闭的应用程序及其活动Bundle?
操作系统跟踪未完成的任务。在一段时间内(自上次使用后约30分钟),它会跟踪任务中的活动实例状态Bundle。
在所有情况下,系统都会在调用了onPause()和onStop()之后调用onDestroy()吗?
除了由于低内存条件而终止进程可能会导致系统在需要系统RAM时紧急情况中或可能不会调用onDestroy()方法之外,还有多种情况下不会调用onDestroy()。

在主线程上,当你按下Home键将应用置于后台,然后用户从应用管理器手动杀死它时,onDestroy方法不会被调用。 - Tomer Shemesh
@TomerShemesh:在那种情况下,onDestroy()可能仍然会被调用。这有点取决于“应用程序管理器”的具体含义。Android中的最近任务列表/概述屏幕和第三方任务管理器应该仍然会导致调用onDestroy()。但是,在设置中的“强制停止”以及一些预安装的任务管理器(不幸的是)执行“强制停止”将终止进程而不调用onDestroy() - CommonsWare
你说得对,它应该被调用,但我确实有过它没有被调用的情况。 - Tomer Shemesh
在使用一段时间后(大约30分钟),我在onCreate方法中记录了一个int值(intent.getIntExtra),并将其作为bundle传递给当前活动。然后我运行了七八个应用程序,直到操作系统杀死了我的当前活动。我等了大约一个半小时。之后,我将我的应用程序带到前台,发现bundle仍然保留了该值。这是否意味着bundle会一直保存到用户关闭应用程序? - Arash
@CommonsWare,一个活动可以是一个或多个进程。终止进程意味着收回它们的资源,没有资源它们就无法运行。我写了killed,因为在IDE Logcat窗格中,在我的应用程序名称前面,写着Dead。而且为什么,过了很长时间后,bundle仍然有我的int值? - Arash
显示剩余3条评论

1
很可能在onStop()之后调用onCreate()。您可以使用onSaveInstanceState()传递捆绑包,该函数在活动或片段暂停或停止时调用。假设您有一个活动并按home键。OnStop和onSaveInstanceState都会被调用。在onSaveInstanceState中,您将bundle保存以保存应用程序的状态。然后,由于它在后台运行时间过长,应用程序被终止。然后,当您再次打开应用程序时,来自onSaveInstanceState的bundle将通过SavedInstanceState参数传递给onCreate(),每当它被重新创建时。请参阅官方文档以获取更多信息https://developer.android.com/training/basics/activity-lifecycle/recreating.html

感谢您向我推荐开发者网站的“开发>培训>重新创建活动”页面。其中有一句非常有用的话(除了其他有用的话)。“...虽然实际的Activity实例已经消失,但系统仍然记得它的存在,因此如果用户返回到该实例,系统将使用一组保存的数据创建一个新的Activity实例。” - flobacca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接