用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
针对一个特定的Activity,每种不同条件下的回调如下:
第一次启动:onCreate()->onStart()->onResume()
退回桌面或者打开新的Activity:onPause()->onStop()
?:新的Activity采用透明主题,那么当前Activity不会回调onStop()
再次回到Activity:onRestart()->onStart()->onResume()
back回退时:onPause()->onStop()->onDestroy()
界面跳转时:旧的Activity先执行onPause()后,新的Activity的才能创建并启动。
接下来我们去代码中实践一下,看看结果:
class MainActivity : AppCompatActivity() {
private val TAG = "wdl"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG,"--onCreate--")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG,"--onRestart--")
}
override fun onStart() {
super.onStart()
Log.d(TAG,"--onStart--")
}
override fun onResume() {
super.onResume()
Log.d(TAG,"--onResume--")
}
override fun onPause() {
super.onPause()
Log.d(TAG,"--onPause--")
}
override fun onStop() {
super.onStop()
Log.d(TAG,"--onStop--")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG,"--onDestroy--")
}
}
资源相关的系统配置发生改变导致Activity被杀死并重新创建
例:屏幕突然旋转,由于系统发生了改变。默认情况下Activity就会被销毁并且重新创建。
**在Activity意外终止时,会回调onPause(),onStop(),onDestroy()。在onStop之前会调用onSaveInstanceState方法保存当前Activity的状态。重建后调用onRestoreInstanceState方法并且把保存的Bundle传递给onCreateonRestoreInstanceState取出并恢复。onRestoreInstanceState在onStart后调用。**
class MainActivity : AppCompatActivity() {
private val TAG = "wdl"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d(TAG, "--onCreate--")
if (savedInstanceState != null) {
val context = savedInstanceState.getString("test")
Log.d(TAG, "--$context--")
}
}
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
Log.d(TAG, "--onSaveInstanceState--")
outState!!.putString("test", "wdlwdlwdl")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG, "--onRestart--")
}
override fun onStart() {
super.onStart()
Log.d(TAG, "--onStart--")
}
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
val context = savedInstanceState!!.getString("test")
Log.d(TAG, "--onRestoreInstanceState:$context--")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "--onResume--")
}
override fun onPause() {
super.onPause()
Log.d(TAG, "--onPause--")
}
override fun onStop() {
super.onStop()
Log.d(TAG, "--onStop--")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "--onDestroy--")
}
}
效果:
-屏幕竖直方向:
-旋转为水平方向:
2. 资源内存不足导致低优先级Activity被杀死
数据存贮和恢复过程与第一种一致。
Activity按照优先级从高到低可以分为一下三类:
如不想因为屏幕旋转而重新创建Activity,在AndroidManifest.xml中相应的配置上加上
android:configChanges="orientation|screenSize"
android:configChanges的(常用)值及其含义:
值 | 含义 |
---|---|
locale | 本地位置发生改变,即语言发生变化 |
keyboardHidder | 键盘可访问性发生改变 |
orientation | 屏幕方向发生改变 |
screenSize | 屏幕尺寸信息发生改变,API13新增,高于13时不添加,屏幕旋转会导致Activity重启 |
Activity中新增:
override fun onConfigurationChanged(newConfig: Configuration?) {
super.onConfigurationChanged(newConfig)
Log.d(TAG, "--onConfigurationChanged:${newConfig!!.orientation}--")
}
可以看到当配置了android:configChanges="orientation|screenSize"属性之后,再次进行屏幕旋转,Activity并未进行重建,从图中可以看到,只是方向发生了改变。
在调用startActivityForResult()
下,setResult()
的调用时机应该是在finish()
回调方法之前,在onPause()
中调用setResult()
无法获取intent值,整体回调的过程如图:(因此我们需要在返回键按下时setResult()并且finish()本身)。