Android四大組件之Activity

Activity是啥?

簡單來講就是用來和用戶交互的界面,由各個控件組成 ,將內容界面化展示於用戶面前,接收用戶的觸摸事件和用戶進行交互,能夠說是使用最頻繁的組件了。java

Activity生命週期

生命週期: onCreate -> onStart -> onResume ->onPause -> onStop-> onDestroy 以及 onRestart 方法android

Activity生命週期圖

一個Activity從建立到銷燬的生命週期流程以下:數據結構

開啓一個界面app

2019-01-26 15:36:04.134 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onCreate: 
2019-01-26 15:36:04.207 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onStart: 
2019-01-26 15:36:04.221 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onResume: 
複製代碼

按下返回鍵ide

2019-01-26 15:36:12.381 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onPause: 
2019-01-26 15:36:12.943 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onStop: 
2019-01-26 15:36:12.944 30064-30064/com.sjc.myapplication I/生命週期-----MainActivity: onDestroy: 
複製代碼
  1. onCreate 界面被建立,咱們通常在這裏進行一些視圖和數據以及響應事件的初始化工做。(initView(),initData(),initAction())
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);
        initView();
        initData();
        initAction();
    }
    private void initView(){};
    private void initData(){};
    private void initAction(){};
複製代碼
  1. onStart 界面可見,此時界面還不可交互
  2. onResume 界面能夠進行交互,好比觸發一些點擊事件。
  3. onPause 界面失去交互,此時不能夠進行交互。常見的致使該生命週期的執行的行爲多是:用戶按下Home鍵、按下back鍵、跳轉到下一個頁面、彈出一個Dialog,或者PopupWindow等。此時咱們能夠作一些存儲數據和中止動畫等,可是不能太耗時,不然會影響下個頁面的跳轉(頁面與頁面以前跳轉,先執行當前頁面的onPause方法,而後執行下一個頁面的 生命週期,具體執行下面有說明)。
  4. onStop 界面徹底不可見的時候調用。兩個Activity跳轉,前一個Activity的onStop執行是在第二個Activity徹底可見並能夠進行交互後執行的(onCreate,onStart,onResume)
  5. onDestroy 界面被銷燬,通常咱們在這裏作一些資源釋放的操做,好比註銷廣播,關閉彈窗(若是頁面被銷燬,彈窗未被關閉,則會形成窗體泄漏),關閉動畫等。
  6. onRestart 界面從新可見,從一個頁面返回上一個頁面,首先會調用上一個頁面的 onRestart 方法,其次調用上一個頁面的 onStart、onResume方法
兩個頁面進行跳轉,ActivityA --> ActivityB 再從ActivityB按下返回鍵返回到ActivityA,其調用的生命週期方法爲:
  • 首先啓動 ActivityA:
2019-02-18 23:08:28.362 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onCreate: 
2019-02-18 23:08:28.388 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onStart: 
2019-02-18 23:08:28.390 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onResume: 
複製代碼
  • 在 ActivityA 中啓動 ActivityB
2019-02-18 23:08:33.347 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onPause: 
2019-02-18 23:08:33.371 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onCreate: 
2019-02-18 23:08:33.393 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onStart: 
2019-02-18 23:08:33.395 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onResume: 
2019-02-18 23:08:33.819 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onStop: 
複製代碼
  • 在 ActivityB 中按下返回鍵
2019-02-18 23:10:59.457 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onPause: 
2019-02-18 23:10:59.482 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onRestart: 
2019-02-18 23:10:59.482 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onStart: 
2019-02-18 23:10:59.483 4980-4980/com.sjc.myapplication I/生命週期-----ActivityA: onResume: 
2019-02-18 23:10:59.813 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onStop: 
2019-02-18 23:10:59.814 4980-4980/com.sjc.myapplication I/生命週期-----ActivityB: onDestroy: 
複製代碼

Activity銷燬時保存數據

Activity 異常銷燬的時候,會調用 ==onSaveInstanceState== 方法保存數據,該方法是在 onStop 以前執行,咱們可使用 Bundle 來儲存數據,當 Activity 重建的時候會調用 ==onRestoreInstanceState== 方法,咱們能夠經過 onRestoreInstanceState(Bundle savedInstanceState)傳遞過來的Bundle來獲取以前儲存的數據。進行數據恢復。固然也能夠在onCreate(Bundle savedInstanceState)方法裏面取出來。動畫

另:onSaveInstanceState 和 onRestoreInstanceState 方法中,系統自動爲咱們作了一些操做: 例如:Edittext 自動還原填寫內容, ListView 還原滾動位置,由於每個View都有本身的 onSaveInstanceState 和 onRestoreInstanceState 方法。spa

activity異常銷燬的場景:操作系統

  • 1.屏幕旋轉會致使Activity重建(能夠經過設置 android : configChanges = "orientation" 來防止Activity重建,還能夠經過設置 android:screenOrientation="portrait" 鎖定Activity方向)
  • 2.內存吃緊,致使優先級低的Activity被回收掉。

Activity 的四種狀態:

  1. running:處於前臺,和用戶進行直接的交互。(系統最不肯意回收)
  2. Paused: 仍然可見,可是不能夠交互。(系統不肯意回收)
  3. Stoped: 不可見,處於後臺。(內存吃緊的時候,有可能會被回收)
  4. Killed: 被殺死,已經從Activity棧中移除。(系統傾向於回收這種 Activity)

Activity四種啓動模式:

經過在 mainfest 裏面的 android:launchMode= ""屬性來設置
複製代碼
  • standard 標準模式,若是不設置啓動模式,Android 系統會默認將啓動模式設置爲該屬性。每啓動一次 Activity 就會==建立一個實例==壓入棧中(連續啓動兩個同樣的 Activity ,會建立兩個實例,按照前後順序壓入棧中)。
  • singleTop 在建立實例的時候,首先會查找任務棧==棧頂==是否有該 Activity 的實例存在,若是有就再也不建立新的實例,直接使用棧中的實例。此時不會走 Activity 的 onCreate、onStart 生命週期方法,直接走 onPause--> onNewIntent --> onResume 方法。
  • singleTask 在建立實例的時候,首先查找任務棧==棧中==是否有該實例的存在,若是有就不從新建立,直接將該實例的上面的全部實例(Activity)移除(Finish),也是不會走 Activity 的 onCreate、onStart 生命週期方法,直接走 onPause--> onNewIntent --> onResume 方法。
  • singleInstance 直接爲該Activity在整個Android系統中建立一個==單獨的任務棧==(若是已經建立過,就再也不從新建立),第一次建立時會走正常的生命週期流程,第二次直接走 onPause--> onNewIntent --> onResume 方法。

關於 taskAffinity 屬性(能夠指定Activity所在的任務棧),在 launchMode 爲 standard 和 singleTop 的時候是沒有做用的。具體做用體如今 singleTask 屬性上。 具體詳情連接 完全弄懂Activity四大啓動模式.net

Activity任務棧:

  1. 棧是一個經常使用的數據結構,棧的特色是先進後出,隊列是先進先出
  2. Activity 是採用棧的數據結構進行管理的,最早打開的 Activity 最後退出。
  3. 打開一個應用的時候系統會默認分配一個任務棧,當全部 Activity 都退出時,棧就清空了。
  4. 在 Android 操做系統中是有多個任務棧的,通常一個應用對應一個任務棧。
  5. 默認狀況下,關閉一個應用,就清空這個這個應用的任務棧,可是這個應用的進程還在。
參考文章:
  1. Android 四大組件
  2. 完全弄懂Activity四大啓動模式
相關文章
相關標籤/搜索