activity状态变化

https://developer.android.google.cn/guide/components/activities/state-changes.html#back   --翻译水平有限,欢迎指正

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

 

配置发生改变


 有许多事件可以触发配置更改。也许最显著的例子是(屏幕)横竖方向的改变。其他可能导致配置更改的情况包括对语言或输入设备的更改。

当发生配置更改时,activity将被销毁并重新创建。要为activity保存简单的暂态数据,必须重写onSaveInstanceState()方法来保存数据,然后使用onCreate()或onRestoreInstanceState()回调来重新创建实例状态。

有关在配置更改中持久化简单数据的具体细节,请参见activity生命周期保存和恢复activity状态部分。有关持久化简单和复杂UI数据的方法的更多信息,请参见保存UI状态

处理多窗口的情况

当应用程序进入多窗口模式时(在Android 7.0 (API级别24)和更高版本中可用),系统会通知当前正在运行的activity配置更改了,从而完成上面描述的生命周期转换。如果一个已经在多窗口模式下的应用程序被调整大小,这种行为也会发生。您的activity可以处理配置更改本身,或者它可以允许系统破坏activity并以新的尺寸重新创建它。

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

在多窗口模式下,虽然用户可以看到两个应用程序,但只有和用户交互的应用程序在前台并且有用户焦点。该activity处于 Resumed 状态,而另一个窗口中的应用程序处于 Paused 状态。

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

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

activity或对话框出现在前台


 如果一个新的activity或对话框出现在前台,获得焦点并部分地覆盖正在进行的activity,则被覆盖的activity将失去焦点并进入 Paused 状态。然后,系统调用onResume()。

当被覆盖的activity返回到前台并恢复焦点时,调用onResume()。

如果一个新的activity或对话框出现在前台,获得焦点并完全覆盖正在进行的activity,则被覆盖的activity将失去焦点并进入 Stopped 状态。于是,系统紧接地调用onPause()和onStop()。

当被覆盖activity的相同实例返回到前台时,系统将调用onRestart()、onStart()和onResume()。如果它是涉及到后台的被覆盖activity的新实例,则系统不会调用onRestart(),只调用onStart()和onResume()。

注意:当用户点击Overview或Home按钮时,系统的行为就好像当前的activity已经被完全覆盖了。

 

用户点击后退按钮


 如果activity在前台,用户点击 Back 按钮,activity将通过onPause()、onStop()和onDestroy()回调进行转换。除了被销毁之外,activity还从回退栈中移除。

需要注意的是,在默认情况下,onSaveInstanceState()回调不会在这种情况下触发。此行为基于假设用户单击Back按钮时并不期望返回该activity的相同实例的假设。但是,您可以重写onBackPressed()方法来实现一些自定义行为,例如“确认退出”对话框。

如果您重写onBackPressed()方法,我们仍然强烈建议您在重写的方法中调用super.onBackPressed()。否则, Back 按钮的行为可能会使用户感到不愉快。

 

posted @ 2018-03-15 14:38  caroline2016  阅读(653)  评论(0编辑  收藏  举报