我无法在应用程序的长期生命周期中找到好的文档。
如果我让应用程序运行,请点击主页按钮,然后单击应用程序的启动器图标,不会调用应用程序的onCreate,并调用前面的Activity的onResume。但据推测,如果我等待足够长时间点击启动器图标将调用Application onCreate并启动MAIN LAUNCHER活动。这是什么时候发生的?
当我浏览“最近”列表中的应用程序时,如果我点击一个我在一个月内没有使用过的非常古老的应用程序,该应用程序将不会返回其先前的状态,而是应用程序将通过其启动。所以在某些时候,应用程序似乎从保存状态转移到没有保存状态。这是什么时候发生的?
如果应用程序因内存压力而被杀死,可能会保存savedInstanceState包并调用Activity onResume,但是此时是否调用了Application的onCreate?捆绑了多长时间?
答案 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)
设备上安装的每个应用程序都在其进程内运行。
如果您是第一次进入应用程序,则会调用以下序列:
如果单击“主页”按钮,应用程序将转到后台并调用以下回调方法:
虽然应用程序在后台,但未指定它将存在多长时间。
系统需要在后台维护它。
许多应用程序,当你在后台时,执行定期同步,运行预定服务或在启动时只是在前台运行,为此目的,Android OS必须以某种方式找到内存来执行所有这些逻辑。因此,如果所需存储器中存在短缺,则OS会杀死进程(例如,您的应用程序)。
因此,如果您将应用程序隐藏到后台并单击应用程序启动器图标或立即从“最近的应用程序”列表返回该应用程序,则会执行以下序列的回调方法(假设您在使用YourCurrentActivity时隐藏了应用程序) :
但是,如果您不再重新进入隐藏的应用程序,那么操作系统很可能已经杀死您的应用程序,有利于满足其他应用程序要求。
如果发生这种情况,则调用以下序列的回调方法:
请注意,将应用程序隐藏到后台时,您仍然是YourCurrentActivity。
执行以下序列是因为System为@CommonsWare指向应用程序创建新进程。
如何防止应用被系统杀死? (Android - implementing startForeground for a service?)
希望这会有所帮助。