前言:
俗稱:好記性不如爛筆頭。
學習任何技術其實也是一樣,誰敢保證看過一遍就會記住了,就會用了,至少我是不敢保證。所以我們需要經常回頭研究,而且會發現每一次的溫故都會有不一樣的收穫—溫故而知新,可以為師矣!
還有,他人告知你的知識點是他人把研究結果分享給你的,而不是你自己研究的。所以要去實踐它,做到吸納它。
- 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;
/**
* Created by itsdf07 on 2017/3/29 10:44.
* E-Mail: [email protected]
* GitHub: https://github.com/itsdf07
*/
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@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@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@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@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}