深入理解Activity生命周期
事实上在安卓的官网对Activity的生命周期有详尽的解释,而且是中文的!
https://developer.android.com/guide/components/activities.html
相信各位早已用过Activity,但是其中的几个生命周期接口还是值得整理关注.通过对官方文档的理解,我们把Activity的生命周期相关记忆点分解为几个问题.
参照谷歌官方给出的图例:
1.生命周期是什么?
Activity是用户与程序交互的接口,它提供了一个用户完成相关操作的窗口.在Android系统中,系统是通过Activity栈来管理Activity的,而Activity则是通过生命周期的方式来管理自身的创建,暂停,销毁等状态的.就像我们主宰一个人的命运,设定,我们说,当这个人出生的时候我们做一些事情比如烧香拜佛,当这个人生病的时候我们要求医问药,当这个人死亡的时候我们要举行追悼会等等,Activity的生命周期就是它从生成到消亡的过程,我们可以通过系统提供的接口,来决定其在不同的状态执行什么样的代码.
Activity的主要生命周期为:onCreate->onStart->onResume->Activity运行->新的Activity运行->onPause->onStop->onDestroy->Activity销毁
- 没有图而需要回忆的的话可以简记为:主线:CSRPSD(长沙如盘丝洞);支线:PR(骗人!),SRS(谁认识!)
1.在手机直观的状态切换中,生命周期中怎样转变?
我简单列出脑海中存在的手机的几种直观的状态
现在要将其各种状态进行实验和组合.代码如下.
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart() called");
}
}
1.点击icon:
D/MainActivity: onCreate() called with: savedInstanceState = [null]
D/MainActivity: onStart() called
D/MainActivity: onResume() called
此时进入正常运行状态.
2.正常运行->按任务键/home键
D/MainActivity: onPause() called
D/MainActivity: onStop() called
3.任务视图->按返回键
D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called
4.任务视图->按home键/切换新任务
没有输出.此时进入后台运行状态.
5.任务视图->滑动杀死应用
Application terminated.
6.正常运行->按锁屏键
D/MainActivity: onPause() called
D/MainActivity: onStop() called
在其他Activity回退:
两个Activity切换:
旧:D/MainActivity: onPause() called
新:D/Main2Activity: onCreate() called with: savedInstanceState = [null]
新:D/Main2Activity: onStart() called
新:D/Main2Activity: onResume() called
D/MainActivity: onStop() called
从新的Activity中按back键回退到上一个Activity
新D/Main2Activity: onPause() called
旧D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called
D/Main2Activity: onStop() called
D/Main2Activity: onDestroy() called
7.待解锁状态->按解锁键
D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called
此时进入”正常运行”状态
由以上实验我们可以简单归纳:
1.Activity第一次创建时,执行onCreate->onStart->onResume,然后正常运行
2.Activity在进入任务视图/进入锁屏状态/按home键,都是经历了onPause->onStop的阶段.
3.Activity从任务视图恢复/从待解锁状态恢复,都是经历了onRestart->onStart->onResume的阶段.
4.切换旧Activity到新Activity:旧onPause,新onCreate,onStart,onResume,旧onStop
5.从新Activity按返回键退回至上一个Actitvity:新onPause,旧onRestart,onStart,onResume,新onStop,onDestory.
事实上,Activity的生命周期两两相对,有规律可循.
1.从Activity的创建与消亡看,onCreate与onDestory相对,都只能调用一次.
2.从Activity是否可见看,onStart与onStop相对,可以转换,可以调用多次
3从Activity是否在最前端看,onResume与onPause相对.
优化建议
官方建议,不能再onPause中做重量的操作–因为必须onPause执行完后,其他的Activity才执行Resume.应当在onStop中执行耗时操作.
关于Activity的特殊生命周期
1.Activity在异常情况下被销毁时,系统会调用onSaveInstanceStatus来保存当前Activity的状态,在恢复时调用onRestoreInstanceStatus来恢复状态.屏幕翻转是典型的意外情况.
它与正常的生命周期没有交集,不固定在其中某一个周期点的之前或之后.
2.保存的数据有:文本框中的字符,滚动位置等.
代码样例:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext = this;
Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {//如果存在保存的数据,就获取字符串并打印
String testText = savedInstanceState.getString("testText");
Log.i(TAG, "onCreate: restore test:" + testText);
}
}
//异常停止Activity
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
outState.putString("testText", "eee");
}
//重建Activity
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String testStr = savedInstanceState.getString("testText");
Log.i(TAG, "onRestoreInstanceState: restore testText:" + testStr);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart() called");
}
}
当横屏时,输出为:
D/MainActivity: onPause() called
I/MainActivity: onSaveInstanceState:
D/MainActivity: onStop() called
D/MainActivity: onDestroy() called
D/MainActivity: onCreate() called with: savedInstanceState = [Bundle[{testText=eee, android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@e18b540, 2131427414=android.view.AbsSavedState$1@e18b540}, android:Panels={0=com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState@73edc79}}]}]]
I/MainActivity: onCreate: restore test:eee
D/MainActivity: onStart() called
I/MainActivity: onRestoreInstanceState: restore testTexteee
D/MainActivity: onResume() called
从日志可以看出,当屏幕横转之后的瞬间,,Activity执行onPause->onStop->onDestory的周期,其中系统调用了onSaveInstanceState方法,保存了outState参数对,下一个瞬间,Activity重新被创建,而onCreate方法中也确实发现了保存好的savedInstance,而打印其中的String则确实输出刚刚保存的内容.
参考资料:<