不同的事件,一些用户触发和一些系统触发,可能导致Activity
从一个状态转换到另一个状态。本文档描述了发生此类转换的一些常见情况以及如何处理这些转换。
有关活动状态的更多信息,请参阅 了解活动生命周期。要了解ViewModel
该类如何帮助您管理活动生命周期,请参阅了解ViewModel类。
发生配置更改
有许多事件可以触发配置更改。也许最突出的例子是纵向和横向取向之间的变化。其他可能导致配置更改的情况包括对语言或输入设备的更改。
当发生配置更改时,该活动将被销毁并重新创建。原来的活动实例将有 onPause()
, onStop()
和 onDestroy()
回调触发。活动的一个新实例将被创建并拥有 , 以及回调触发。 onCreate()
onStart()
onResume()
使用ViewModels,onSaveInstanceState()方法和/或持久本地存储的组合来跨配置更改保留活动的UI状态。决定如何组合这些选项取决于UI数据的复杂性,应用程序的使用情况以及考虑检索速度与内存使用情况的关系。有关保存活动UI状态的更多信息,请参阅保存UI状态。
处理多窗口案件
当应用程序进入Android 7.0(API级别24)及更高版本可用的多窗口模式时,系统会通知当前正在运行的配置更改活动,从而执行上述生命周期转换。如果应用程序已处于多窗口模式获取调整大小,也会发生此行为。您的活动可以处理配置更改本身,也可以让系统销毁活动并使用新维度重新创建它。
有关多窗口生命周期的更多信息,请参阅多窗口支持 页面的多窗口生命周期部分 。
在多窗口模式下,虽然有两个应用程序对用户可见,但只有与用户交互的应用程序位于前台并具有焦点。该活动处于恢复状态,而另一个窗口中的应用处于暂停状态。
当用户从应用程序A切换到应用程序B时,系统会调用 onPause()
应用程序A和onResume()
应用程序B.每次用户在应用程序之间切换时,都会在这两种方法之间切换。
有关多窗口的更多详细信息,请参阅 多窗口支持。
活动或对话框出现在前台
如果前景中出现新的活动或对话框,关注并部分覆盖正在进行的活动,则所涵盖的活动失去焦点并进入暂停状态。然后,系统调用 onResume()
它。
当覆盖的活动返回到前景并重新获得焦点时,它会调用onResume()
。
如果前景中出现新的活动或对话框,关注焦点并完全覆盖正在进行的活动,则覆盖的活动失去焦点并进入停止状态。然后系统迅速地接通onPause()
和 呼叫onStop()
。
当覆盖活动的同一实例回来到前台时,系统调用onRestart()
, onStart()
以及 onResume()
对活动。如果它是涉及后台的被覆盖活动的新实例,则系统不会调用onRestart(),只调用 onStart()
和 onResume()
。
注意:当用户点击概览或主页按钮时,系统的行为就好像当前活动已被完全覆盖。
用户点击返回按钮
如果活动是在前台,而用户点击后退按钮,该活动通过转换 onPause()
, onStop()
和 onDestroy()
回调。除了被销毁之外,该活动也从后退栈中移除。
需要注意的是,默认情况下, onSaveInstanceState()
回调在这种情况下不会触发。此行为基于假设用户点击后退按钮而不期望返回到活动的同一实例。但是,您可以重写该 onBackPressed()
方法来实现一些自定义行为,例如“确认 - 退出”对话框。
如果您重写该onBackPressed()
方法,我们仍强烈建议您super.onBackPressed()
从重写的方法调用 。否则,后退按钮的行为可能会对用户产生震动。
系统杀死应用程序进程
如果应用程序处于后台并且系统需要释放前台应用程序的额外内存,则系统可以终止后台应用程序以释放更多内存。要详细了解系统如何决定销毁哪些进程,请阅读 活动状态并从内存和 进程和应用程序生命周期中弹出。
要了解如何在系统终止您的应用程序进程时保存活动UI状态,请参阅 保存和恢复活动状态。