Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Notes 之 Activity生命周期的探索

Android Notes 之 Activity生命周期的探索

編輯:關於Android編程

Activity:作為四大組件之一,也是與用戶交互最多的組件,因此為了更好的交互效果,了解Activity的生命周期,正確分配每個階段該完成的工作就顯得十分必要,例如:我們不能在onPause中做耗時的操作,因為新的Activity必須在前一個Activity執行了onPause才能執行onResume顯示。

Activity的生命周期分為兩部分,一部分是典型情況下的生命周期,另一部分是異常情況的生命周期。

典型情況:正常的生命周期,用戶參與的情況。

異常情況:Activity被收回或者設備的Configuration發生變化導致Activity被銷毀並重建。

1. 典型Activity生命周期分析

Activity生命周期圖

 

onCreate和onStart:這兩個階段Activity正在創建,可以進行初始化動作,比如setContentView,初始化資源。

onResume:這時Activity已經前台可見,具備交互功能

onPause:表示Activity正在停止,這是可以做一些存儲數據,停止動畫的工作,不能太耗時,不然會影響新的Activity的顯示。

onStop:表示Activity即將停止,這裡可以做一些重量級的操作,也不能太耗時

onDestroy:表示Activity即將銷毀,這裡可以做一些回收動作和資源釋放。

我的操作及日志情況

1.完整的生命周期

 

生命周期1

 

 

生命周期1

 

2.Activity間跳轉的生命周期

 

這裡寫圖片描述

 

 

這裡寫圖片描述

 

通過上述分析,我們可以清晰的看到生命周期的調用順序,注意,

1.MainActivity跳到SecondActivity的時候,先是回調MainActivity的onPause,然後才回調SecondActivity的直到onResume的操作,為了SecondActivity盡快切換到前台,不應該在onPause中做太耗時的操作。

2.MainActivity跳到SecondActivity的時候,SecondActivity回調onResume後,調用了MainActivity的onStop,這個方法也不應該有太耗時的操作,不然SecondActivity會有卡頓的情況

2. 異常情況下的生命周期分析

2.1 資源相關系統配置改變導致Activity被殺死並重建

當系統配置變化時,Activity會被銷毀,但系統會調用onSaveInstanceState來保存當前的Activity的狀態,這個方法在onStop之前調用,然後調用onRestoreInstateState來恢復數據,這個方法在onStart之後調用

我的操作及日志情況
這裡寫圖片描述

這裡寫圖片描述

MainActivity.java

/**
* 注意到onCreate中也有`Bundle savedInstanceState`,也可以在回調onCreate的時候恢復數據,注意先判斷savedInstanceState非空
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG,"MainActivity-->onCreate");
    setContentView(R.layout.activity_main);
    Log.i("savedInstanceState-->","is null? "+(savedInstanceState==null)+"");
    editText = (EditText) findViewById(R.id.edit_text);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.i(TAG,"MainActivity-->onSaveInstanceState");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.i(TAG,"MainActivity-->onRestoreInstanceState");
}

通過上述分析,我們可以清晰的看到在切換橫豎屏時數據的保存及恢復情況,自己如果有想保存的數據也可以在saveInstanceState中實現,恢復時既可以在onCreate中,也可以在onRestoreInstanceState中,注意,
1.在按下home鍵,或是切換到另外的Activity時,也會回調onSaveInstanceState保存數據,因為系統也怕在你長時間不操作或內存不足時,Activity被回收,但如果沒有發生系統回收,則不會回調onRestoreInstanceState進行數據恢復
2.即便是我們按下home鍵或者是跳轉到另一個Activity在跳轉回來之前的Activity仍舊保存著之前的EditText中的狀態信息。(Stopped狀態下的Activity仍然保存著所有的狀態信息和成員變量)

2.2 內存不足導致低優先級Activity被殺死

Activity按優先級分三種:
(1)前台Activity:正在和用戶交互的Activity,優先級高

(2)可見但非前台Activity:比如有一個AlertDialog彈出時

(3)後台Activity:執行了onStop的Activity

內存不足時,系統就會按照優先級由低到高回收Activity

3. 阻止Activity重建

由上述栗子我們知道資源相關系統配置改變會導致Activity被殺死並重建,不過我們也可以阻止Activity重建,只需給Activity指定configChanges屬性即可。

例如我們上述的旋轉屏幕的栗子,可以給Activity指定orientation和screenSize屬性,Activity就不會重建。


            
                

                
            
        

 @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.i(TAG,"MainActivity-->onConfigurationChanged newConfigOrientation"+newConfig.orientation);
    }

日志信息
這裡寫圖片描述

 

由上述日志可以看出,當我們配置了configChanges後,不會回調onSaveInstanceState和onRestoreInstanceState,也沒有onCreate,取而代之的是onConfigurationChanged,因此我們可以在其中實現自己的邏輯,下面一個小demo在onConfigurationChanged根據橫豎屏更改EditText中的內容

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
        editText.setText("ORIENTATION_LANDSCAPE");
    }else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
        editText.setText("ORIENTATION_PORTRAIT");
    }
}

實現效果如下
這裡寫圖片描述

下面為常用的配置引起Activity重建的屬性

項目 含義 locale 切換系統語言 keyboardHidden 鍵盤的可訪問性發生改變,比如用戶調出了鍵盤 orientation 屏幕方向發生改變,旋轉手機屏幕 screenSize 屏幕尺寸發生改變,旋轉屏幕也會導致屏幕尺寸發生改變,當minSdkVersion和targetSdkVersion均低於13的時候,此選項不會導致Activity重啟,否則會導致Activity重啟
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved