最基本三对六个核心回调方法
-
onCreate/onDestroy
-
onStart/onStop onStart后可见,onStop后不可见
-
onResume/onPause onResume后可交互,onPause后不可交互
注:文档上说,onStart后可见,但实践证明,即使到onResume扔不可见(可以在onResume中执行长时间的代码来验证),当调用onWindowFocusChanged时UI才可见。
阿里巴巴Android开发手册说onAttachedToWindow()时,Activity 会与它的 Window 关联,这时UI才会开始绘制,在 Activity#onWindowFocusChanged() 时,UI 才变成可交互状态,可以提示用户使用。
onResume
动态注册广播registerReceiver
onPause
适合做: 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费; 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(such as a draft email); 释放系统资源,例如broadcast receivers(unregisterReceiver), sensors (like GPS), 或者是其他任何会影响到电量的资源。 例如, 如果你的程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。
不适合做: 耗时较长的工作。因为前一个Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在 onPause 方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率。
onCreate
示范代码
TextView textView;
// some transient state for the activity instance
String gameState;
@Override
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like
// the view hierarchy
super.onCreate(savedInstanceState);
// recovering the instance state
if (savedInstanceState != null) {
gameState = savedInstanceState.getString(GAME_STATE_KEY);
}
// set the user interface layout for this activity
// the layout file is defined in the project res/layout/main_activity.xml file
setContentView(R.layout.main_activity);
// initialize member TextView so we can manipulate it later
textView = (TextView) findViewById(R.id.text_view);
}
onWindowFocusChanged(boolean hasFocus)
一个Activity启动后onCreate、onStart、onResume等过程后,Activity并不是真正可见的,只有当 onWindowFocusChanged 方法最后调用并且参数为true的时候Activity才是真正的可见,这个时候才可以和用户进行交互。
我们可以这 onWindowFocusChanged 可以做一些事情。比如, 获取布局中的控件的尺寸。
保存和恢复实例状态
onSaveInstanceState/onRestoreInstanceState savedInstanceState可能性有这么几种情况: 1.当用户按下Home键时; 2.长按Home键,选择运行其他的程序时; 3.按下电源键(关闭屏幕显示)时; 4.从Activity A启动一个新的Activity时; 5.屏幕方向切换时,如从横屏切换到竖屏; 6.电话打入等情况发生时;
// This callback is called only when there is a saved instance that is previously saved by using
// onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// 总是调用超类,以便它可以恢复视图层次超级??
super.onRestoreInstanceState(savedInstanceState);
// 系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空
textView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}
// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(GAME_STATE_KEY, gameState);
outState.putString(TEXT_VIEW_KEY, textView.getText());
// call superclass to save any view hierarchy
super.onSaveInstanceState(outState);
}
Activity#onSaveInstanceState()方法只能用于保存临时性数据(存到传入的Bundle对象),不能进行持久化存储(持久化存储应该在Activity#onPause()/onStop() 中实现)。
1、如果是用户自动按下返回键,或程序调用finish()退出程序,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。 2、每次用户旋转屏幕时,您的Activity将被破坏并重新创建。当屏幕改变方向时,系统会破坏并重新创建前台Activity,因为屏幕配置已更改,您的Activity可能需要加载替代资源(例如布局)。即会执行onSaveInstanceState()和onRestoreInstanceState()的。
isFinishing()
该方法只是简单地返回mFinished,该变量在activity的finish()中赋值。
在onPause或onStop中可以结合该方法判断它是否被关闭(继而销毁),从而做一些资源回收处理。
《阿里巴巴Android开发手册》
- 【推荐】不要在Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的销毁和停止,因为onDestroy()执行的时机可能较晚。可根据实际需要,在Activity#onPause()/onStop()中结合isFinishing()的判断来执行。
切换Activity时的生命周期函数顺序
Activity A 启动 Activity B ,其生命周期方法调用如下:
- Activity A onPause()
- Activity B onCreate()
- Activity B onStart()
- Activity B onResume()
- Activity A onStop()
如果启动Activity B时A仍可见(可能情况包括B是一个Dialog或透明的,或以多窗口方式启动B),则不会调用A的onStop,因为A仍然可见。其生命周期方法调用如下:
- Activity A onPause()
- Activity B onCreate()
- Activity B onStart()
- Activity B onResume()
生命周期监听器
AppCompatActivity 会自动继承来自父ComponentActivity 的方法 getLifeCycle。可以addObserver