处理活动状态更改(活动三)

2018-07-24  本文已影响21人  鹿小纯0831

不同的事件,一些是用户触发的,一些是系统触发的,可以导致Activity从一个状态转换到另一个状态。 本文档描述了发生此类转换的一些常见情况,以及如何处理这些转换。

有关活动状态的更多信息,请参阅了解活动生命周期。 要了解ViewModel类如何帮助您管理活动生命周期,请参阅了解ViewModel类。

一、发生配置更改

有许多事件可以触发配置更改。 也许最突出的例子是纵向和横向之间的变化。 可能导致配置更改的其他情况包括更改语言或输入设备。

发生配置更改时,将销毁并重新创建活动。 原始活动实例将触发onPause(),onStop()和onDestroy()回调。 将创建一个新的活动实例,并触发onCreate(),onStart()和onResume()回调。

使用ViewModel,onSaveInstanceState()方法和/或持久本地存储的组合来保持活动在配置更改中的UI状态。 决定如何组合这些选项取决于UI数据的复杂性,应用程序的用例以及检索速度与内存使用情况的关系。 有关保存活动UI状态的更多信息,请参阅保存UI状态。

1、处理多窗口案例

当应用程序进入多窗口模式(在Android 7.0(API级别24)及更高级别中可用)时,系统会通知当前正在运行的配置更改活动,从而完成上述生命周期转换。如果已经处于多窗口模式的应用程序调整大小,也会发生此行为。您的活动可以自行处理配置更改,也可以允许系统销毁活动并使用新维度重新创建活动。

有关多窗口生命周期的更多信息,请参阅“多窗口支持”页面的“多窗口生命周期”部分。

在多窗口模式中,尽管有两个应用程序对用户可见,但只有与用户交互的应用程序位于前台并具有焦点。该活动处于“已恢复”状态,而另一个窗口中的应用程序处于“暂停”状态。

当用户从应用程序A切换到应用程序B时,系统会在应用程序A上调用onPause(),在应用程序B上调用onResume()。每次用户在应用程序之间切换时,它都会在这两种方法之间切换。

有关多窗口的更多详细信息,请参阅多窗口支持。

二、活动或对话框出现在前台

如果前景中出现新活动或对话框,关注并部分覆盖正在进行的活动,则覆盖的活动将失去焦点并进入暂停状态。 然后,系统调用onPause()。

当覆盖的活动返回到前台并重新获得焦点时,它会调用onResume()。

如果前景中出现新活动或对话框,关注并完全覆盖正在进行的活动,则覆盖的活动将失去焦点并进入“已停止”状态。 然后系统快速连续调用onPause()和onStop()。

当覆盖活动的同一实例返回到前台时,系统会在活动上调用onRestart(),onStart()和onResume()。 如果它是覆盖活动的新实例,则系统不会调用onRestart(),只调用onStart()和onResume()。

注意:当用户点击“概览”或“主页”按钮时,系统的行为就像当前活动已完全覆盖一样。

三、用户点击后退按钮

如果活动位于前台,并且用户点击“返回”按钮,则活动将转换为onPause(),onStop()和onDestroy()回调。 除了被销毁之外,活动也从后台堆栈中移除。

重要的是要注意,默认情况下,onSaveInstanceState()回调在这种情况下不会触发。 此行为基于用户点击“后退”按钮而不期望返回到活动的同一实例的假设。 但是,您可以覆盖onBackPressed()方法以实现某些自定义行为,例如“confirm-quit”对话框。

如果重写onBackPressed()方法,我们仍然强烈建议您从重写方法调用super.onBackPressed()。 否则,后退按钮行为可能会对用户产生不良影响。

四、系统杀死应用程序进程

如果应用程序在后台并且系统需要为前台应用程序释放额外的内存,则系统可以终止后台应用程序以释放更多内存。 要了解有关系统如何决定销毁哪些进程的更多信息,请阅读活动状态以及从内存和进程以及应用程序生命周期中弹出。

要了解在系统终止应用程序进程时如何保存活动UI状态,请参阅保存和恢复活动状态。

上一篇 下一篇

猜你喜欢

热点阅读