应用启动生命周期

时间:2015-07-01 18:55:05

标签: android

我无法在应用程序的长期生命周期中找到好的文档。

如果我让应用程序运行,请点击主页按钮,然后单击应用程序的启动器图标,不会调用应用程序的onCreate,并调用前面的Activity的onResume。但据推测,如果我等待足够长时间点击启动器图标将调用Application onCreate并启动MAIN LAUNCHER活动。这是什么时候发生的?

当我浏览“最近”列表中的应用程序时,如果我点击一个我在一个月内没有使用过的非常古老的应用程序,该应用程序将不会返回其先前的状态,而是应用程序将通过其启动。所以在某些时候,应用程序似乎从保存状态转移到没有保存状态。这是什么时候发生的?

如果应用程序因内存压力而被杀死,可能会保存savedInstanceState包并调用Activity onResume,但是此时是否调用了Application的onCreate?捆绑了多长时间?

2 个答案:

答案 0 :(得分:4)

  

但是假设我等了足够长时间点击启动器图标会调用Application onCreate并启动MAIN LAUNCHER活动。这是什么时候发生的?

这些是不同的问题。

在进程分叉后不久创建Application单例,作为为您启动新进程的一部分。当某些内容需要您的应用程序存在时(例如,用户点击启动器图标)并且您的进程尚不存在时,将触发此操作。 Processes do not live forever。任何特定过程留在记忆中的时间取决于各种环境因素。

启动器活动是恢复现有任务,还是重置任务,取决于任务是否存在(即,用户是否将任务从最近任务列表中滑出)以及用户自用户之后已执行多长时间离开了任务。任务被认为是“活着”大约30分钟,尽管有一些清单条目可以用来尝试稍微调整一下。

  

所以在某些时候,应用程序似乎从保存状态转移到没有保存状态。这是什么时候发生的?

约30分钟(见上一段)。

  

如果应用因内存压力而被杀死

我认为通过“app get's killed”你的意思是“应用程序的进程被终止”。

  

可能保存了savedInstanceState包并调用了Activity onResume,但是那时是否调用了Application的onCreate?

是的,因为需要为您创建一个新流程。

  

捆绑包保存了多长时间?

约30分钟(见上文)。

答案 1 :(得分:3)

设备上安装的每个应用程序都在其进程内运行。

  1. 如果您是第一次进入应用程序,则会调用以下序列:

    • 应用。的的onCreate()
    • YourFirstActivity。 onCreate()(前提是在AndroidManifest.xml中声明了YourFirstActivity)
    • YourFirstAcitvity。的在onStart()
    • YourFirstActivity。的的onResume()
  2. 如果单击“主页”按钮,应用程序将转到后台并调用以下回调方法:

    • YourCurrentActivity。的的onPause()
    • YourCurrentActivity。 onSaveInstanceState() - 此调用未完全指定,但您可以假设在大多数情况下调用onStop()方法应调用onSaveInstanceState()。
    • YourCurrentActivity的的onStop();
  3. 虽然应用程序在后台,但未指定它将存在多长时间。

    系统需要在后台维护它。

    许多应用程序,当你在后台时,执行定期同步,运行预定服务或在启动时只是在前台运行,为此目的,Android OS必须以某种方式找到内存来执行所有这些逻辑。因此,如果所需存储器中存在短缺,则OS会杀死进程(例如,您的应用程序)。

    因此,如果您将应用程序隐藏到后台并单击应用程序启动器图标或立即从“最近的应用程序”列表返回该应用程序,则会执行以下序列的回调方法(假设您在使用YourCurrentActivity时隐藏了应用程序) :

    • YourCurrentActivity的 onRestart()
    • YourCurrentActivity的在onStart()
    • YourCurrentActivity的 onRestoreInstanceState()
    • YourCurrentActivity的的onResume()

    但是,如果您不再重新进入隐藏的应用程序,那么操作系统很可能已经杀死您的应用程序,有利于满足其他应用程序要求。

    如果发生这种情况,则调用以下序列的回调方法:

    • 应用。的的onCreate()
    • YourCurrentActivity的的onCreate();
    • YourCurrentActivity的在onStart();
    • YourCurrentActivity的的onResume();

    请注意,将应用程序隐藏到后台时,您仍然是YourCurrentActivity。

    执行以下序列是因为System为@CommonsWare指向应用程序创建新进程。

    如何防止应用被系统杀死? (Android - implementing startForeground for a service?

    希望这会有所帮助。