前言:
俗称:好记性不如烂笔头。
学习任何技术其实也是一样,谁敢保证看过一遍就会记住了,就会用了,至少我是不敢保证。所以我们需要经常回头研究,而且会发现每一次的温故都会有不一样的收获—溫故而知新,可以為師矣!
还有,他人告知你的知识点是他人把研究结果分享给你的,而不是你自己研究的。所以要去实践它,做到吸纳它。
- Activity启动生命周期
- Activity跳转生命周期
- Activity返回生命周期
- Activity退出生命周期
- Activity切后台生命周期
- Activity唤醒前台生命周期
- Activity横竖屏生命周期
Demo:点击获取代码
对于Android研发来说,四大组件的Activity本应该熟练掌握,这边先做下对于Activity的启动及正常界面跳转时的生命周期笔记。
我们来看一下这一张经典的生命周期流程图:
接下来,我将根据上图所列举的生命周期的调用顺序通过log信息打印来说明其生命周期。
###Code:
基类:在基类实现上图生命周期并做Log信息打印
package com.sdf.aso.activitylifecycle;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class BaseActivity extends Activity {
public final static String TAG = "dfsu";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onCreate :");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStart :");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onResume :");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onPause :");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStop :");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestart :");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onDestroy :");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onSaveInstanceState : outState = " + outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestoreInstanceState : savedInstanceState = " + savedInstanceState);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onConfigurationChanged : newConfig = " + newConfig);
}
}
接下来实现用来简单的验证界面跳转时的Activity(extend BaseActivity, 只简单实现跳转):
MainActivity.java --> FirstActivity.java --> SecondActivity.java --> MainActivity.java
以上Activity循环跳转
###步骤及Log信息:
-
从启动到逐个循环跳转
1.1、启动:正常的启动或者Ide启动MainActivity03-29 13:28:48.942 1700-1700/?com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate : 03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart : 03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
1.2、从MainActivity —跳转到—> FirstAcivity
```
03-29 13:30:00.100 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
03-29 13:30:00.115 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate :
03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
03-29 13:30:00.558 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
```
1.3、从FirstActivity —跳转到—> SecondActivity
```
03-29 13:30:32.492 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
03-29 13:30:32.508 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onCreate :
03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart :
03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume :
03-29 13:30:32.969 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
```
1.4、从SecondActivity —跳转到—> MainActivity
03-29 13:31:54.744 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause : 03-29 13:31:54.762 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate : 03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart : 03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume : 03-29 13:31:55.217 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
-
在第1步的基础上逐个返回到MainActivity在点击返回退出程序
2.1、从MainActivity —返回到—> SecondActivity
03-29 13:36:44.967 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause : 03-29 13:36:44.972 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onRestart : 03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart : 03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume : 03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop : 03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
2.2、从SecondActivity —返回到—> FirstActivity
```
03-29 13:37:49.299 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause :
03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onRestart :
03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onDestroy :
```
2.3、FirstActivity —返回到—> MainActivity
```
03-29 13:38:27.465 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onDestroy :
```
2.4、从MainActivity点返回退出程序
```
03-29 13:38:41.731 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
```
-
前后台切换(在MainActivity界面验证)
3.1、切后台
03-29 14:08:47.984 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause : 03-29 14:08:48.384 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
3.2、唤醒到前台
```
03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
```
3.3、直接结束进程则不会有其他生命周期的函数调用
-
横竖屏切换(在MainActivity界面验证)
在BaseActivity中增加横竖屏时的生命函数:
onSaveInstanceState :Activity 即将销毁时保存数据
onRestoreInstanceState :Activity 重建或者恢复时候取出数据
当加上以上函数时,在执行第1点Activity跳转的时候,比如MainActivity --> FirstActivity,将会在onStop前调用一次数据存储onSaveInstanceState ,log信息如下:03-29 15:04:51.862 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause : 03-29 15:04:51.872 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate : 03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart : 03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume : --> 03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@34cea9e0}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@3700c499, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@e90835e}}]}] 03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
4.1、在Activity默认没有设置android:configChanges或者设置为:android:configChanges="orientation|keyboardHidden"时,生命周期为一致,都执行了销毁流程并重新实例Activity,用例:MainActivity(默认没设置)、FirstActivity(设置:android:configChanges=“orientation|keyboardHidden”)
执行横屏如下:03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause : 03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}] 03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop : 03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy : 03-29 14:25:01.808 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate : 03-29 14:25:01.823 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart : 03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}] 03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
恢复竖屏
```
03-29 14:25:36.571 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState
1
@
93
d
94
d
b
,
16909173
=
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
w
i
d
g
e
t
.
A
c
t
i
o
n
B
a
r
V
i
e
w
1@93d94db, 16909173=com.android.internal.widget.ActionBarView
1@93d94db,16909173=com.android.internal.widget.ActionBarViewSavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow
P
a
n
e
l
F
e
a
t
u
r
e
S
t
a
t
e
PanelFeatureState
PanelFeatureStateSavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow
P
a
n
e
l
F
e
a
t
u
r
e
S
t
a
t
e
PanelFeatureState
PanelFeatureStateSavedState@195210aa}}]}]
03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
03-29 14:25:36.608 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
03-29 14:25:36.620 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState
1
@
93
d
94
d
b
,
16909173
=
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
w
i
d
g
e
t
.
A
c
t
i
o
n
B
a
r
V
i
e
w
1@93d94db, 16909173=com.android.internal.widget.ActionBarView
1@93d94db,16909173=com.android.internal.widget.ActionBarViewSavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow
P
a
n
e
l
F
e
a
t
u
r
e
S
t
a
t
e
PanelFeatureState
PanelFeatureStateSavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow
P
a
n
e
l
F
e
a
t
u
r
e
S
t
a
t
e
PanelFeatureState
PanelFeatureStateSavedState@195210aa}}]}]
03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
```
4.2、在Activity默认没有设置android:configChanges或者设置为:android:configChanges="orientation|screenSize"时,Activity的生命周期与4.1中不一样,不会重新执行相应的生命周期,而是执行了onConfigurationChanged 函数,用例:SecondActivity
执行横屏如下:
```
03-29 15:43:27.398 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w598dp h335dp 480dpi nrml land finger -keyb/v/h -nav/h s.62}
```
恢复竖屏
```
03-29 15:43:29.753 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.63}
```