【问题标题】:How is bundle sent to onCreate if App process killed?如果 App 进程被杀死,bundle 如何发送到 onCreate?
【发布时间】:2016-05-20 20:35:48
【问题描述】:

在活动生命周期图中,有一个从“onStop”到“应用程序进程被终止”到“onCreate”的箭头。我一直想知道,现在我将就片段进行简短的讨论;如果整个应用程序进程被破坏,onCreate 怎么可能从 onStop 接收捆绑包?系统是否跟踪被杀死的应用程序及其活动包?我认为这就是它的做法,因为此时被杀死的应用程序将分配给它的内存为零。

此外,从页面管理活动生命周期>启动活动的最后一段中,“系统在所有情况下都调用 onDestroy() 之后调用了 onPause() 和 onStop(),除了以下情况:...”而且这种情况并没有说明内存不足。这让我认为箭头永远不应该从 onStop 转到 onCreate 因为“具有更高优先级的应用程序需要内存”。这是一个错字还是我读错了?我想我读错了,因为“Killable?” “一般来说,活动生命周期中的运动如下所示:”图表中的列。

其中一个必须是错误的,要么是活动生命周期图表中的箭头,要么是“系统在所有情况下都调用 onPause() 和 onStop() 之后调用 onDestroy(),除了一个:...”语句.希望我是断章取义。

【问题讨论】:

    标签: android activity-lifecycle


    【解决方案1】:

    如果整个应用进程被销毁,onCreate 怎么可能从 onStop 接收捆绑包?

    它不会“从 onStop 接收捆绑包”,因为 onStop()Bundle 无关。传递给onCreate()onRestoreInstanceState()Bundle 包含由onSaveInstanceState() 放入早先Bundle 的数据。 Bundle 的内容跨进程边界传递到核心操作系统进程,该进程管理未完成活动及其任务的状态。该内容会在相关时传递回您的应用的新流程。

    系统是否会跟踪被杀死的应用程序及其活动包?

    操作系统会跟踪未完成的任务。有一段时间(自上次使用后约 30 分钟),它会跟踪任务上的活动的实例状态 Bundle

    系统在所有情况下都调用了onPause()和onStop()之后调用了onDestroy()

    onDestroy() 没有被调用的情况不止一种。由于内存不足而终止进程可能会也可能不会导致调用onDestroy(),具体取决于系统 RAM 需求的紧迫性。

    【讨论】:

    • 不调用 ondestroy 的主要方式是当您按 home 键进入后台,然后用户从应用程序管理器中手动将其杀死
    • @TomerShemesh: onDestroy() 在这种情况下仍可能被调用。这在一定程度上取决于“应用程序管理器”是什么。作为 Android 和第三方任务管理器一部分的最近任务列表/概览屏幕仍应导致调用 onDestroy()。但是,设置中的“强制停止”以及一些(不幸地)执行“强制停止”的预安装任务管理器将终止进程而不调用onDestroy()
    • 你说得对,这应该是正确的,但是有过没有被调用的时候
    • “有一段时间(自上次使用后约 30 分钟),它......”我记录了一个 int 值(intent.getIntExtra),我将它传入一个 bundleonCreate 方法中的当前活动。然后我运行七八个应用程序,直到操作系统终止了我当前的活动。我等了大约一个半小时。之后,我将我的应用程序带到了前台,我看到了仍然有价值的捆绑包。这是否意味着捆绑包会一直保存到用户关闭应用程序?
    • @Arash:“直到操作系统终止了我当前的活动”——操作系统不会终止活动。它终止进程。 “这是否意味着捆绑包会一直保存到用户关闭应用程序?” -- 我不会这么认为。
    【解决方案2】:

    onCreate 很有可能在 onStop() 之后被调用。您使用 onSaveInstanceState() 传递捆绑包,该方法在活动或片段暂停或停止时调用。假设您有一项活动,然后按回家。 OnStop 和 onSaveInstanceState 都被调用。在 onSaveInstanceState 中,您保存捆绑包以保存应用程序的状态。然后该应用程序被杀死,因为它在后台的时间太长了。然后,当您打开应用程序时,从 onSaveInstanceState 备份包时,它会在重新创建时传递给 SavedInstanceState 参数中的 oncreate。更多请查看官方文档https://developer.android.com/training/basics/activity-lifecycle/recreating.html

    【讨论】:

    • 感谢您将我推荐到开发人员的网站 Develop>Training>Recreating an Activity。它确实有一个非常有用的句子(在其他有用的句子中)。 “......那么虽然实际的 Activity 实例已经消失,但系统会记住它的存在,因此如果用户导航回它,系统会使用一组保存的数据创建一个新的 Activity 实例”
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2010-12-08
    • 2018-11-05
    • 1970-01-01
    • 2013-04-07
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多