1. 程式人生 > >Android Activity生命周期及啟動模式

Android Activity生命周期及啟動模式

但是 判斷 撥打 開發 文件中 設備 相關 不可 des

  曾經搞過許多東西,再熟練的東西一段時間沒有碰都會生疏或忘記。後來體會到寫成文檔記錄下來的重要性,但有些word或ppt記錄下來的東西隨著時間流逝會丟失,或者不願去看。或許保存成博客的形式,會是更好的選擇,勉勵自己。

  Activiy是Android開發中最常用最常見的組件,是Android開發人員開始學習首先接觸的組件,也是大部分人建立一個工程後,首先要處理的可能就是Activity。這麽重要、常用、簡單、易上手的組件,牢固掌握其基礎知識,對於開發人員是非常重要的。本文會首先解釋其基本概念,對於其使用方式不做過多贅述,重點放在Activity的生命周期和啟動模式上,附帶講解一些Activity管理的經驗。

1 Activity的概念

  官方解釋“An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.”(https://developer.android.google.cn/reference/android/app/package-summary)中文含義是"Activity 是一個提供帶屏交互應用程序的組件,例如撥打手機,拍照,發郵件,或看地圖。"也就是說,Activity是屏幕交互View的容器,是用戶通過屏幕操控程序的入口。

2 Activity的基本使用

  一般Activity和一個Layout布局文件配合使用。創建一個繼承android.app.Activity的java類和一個放在"/res/layout"文件夾下的xml布局文件。然後在Activity的onCreate方法中,使用setContentView方法,制定layout的resourceID。這裏不做展開。

3 Activity的生命周期

3.1Activity的運行狀態

作為與用戶交互位目的的組件。在啟動後會有四種狀態。

1,Active或者Running,是指Activity處於前端,獲取了前臺焦點的狀態,此時Activity位於活動棧的棧頂。

2,paused,是指Activity處於可見狀態,但是喪失了前臺焦點。例如:被透明的Activity遮擋,設備轉入休眠等。Android的通知欄不會導致Activity 進入paused狀態。

3,stopped,當Activity對用戶不可見時進入stopped狀態,但此時仍保持已有的狀態和成員信息,等等系統判斷恢復運行狀態,或者銷毀。此時,如果系統內存不足,Activity占用的資源有可能被釋放。

4,destroyed,Activity被系統回收,內存釋放。此時Activity會從活動棧中移除。

  3.2 Activity的生命周期回調

    Android對Activity定義了7個生命周期的回調,對應Activity的創建和四種運行狀態的切換。分別是:    

      • onCreate()
      • onStart()
      • onResume()
      • onPause()
      • onStop()
      • onDestroy()
      • onRestart()

    官網給出的生命周期回調流程圖為:

技術分享圖片

  結合上一部分解釋的Activity的四種運行狀態,我繪制了一個簡單的生命周期流程圖。如下:

技術分享圖片

  結合代碼來看(相關代碼會在本文最後作為附件給出)。Activity啟動到繪制完畢,調用的生命周期為:

技術分享圖片

如果此時按了home鍵,Activity進入後臺,調用的生命周期為:

技術分享圖片

再次喚醒Activity,調用的生命周期為:

技術分享圖片

結束當前Activity,調用的生命周期為:

技術分享圖片

在啟動Activity後,如果切換了屏幕方向,會導致當前Activity銷毀並重繪。如果想取消屏幕切換時Activity的銷毀重繪,對於Android3.2之前(不含),可以在manifest文件中設置當前Activity的android:configChanges=”orientation|keyboardHidden”,對於Android3.2及之後的sdk,可以設置android:configChanges=”orientation|keyboardHidden|screenSize“。詳見博客https://blog.csdn.net/u014070729/article/details/50867646。

4 Activity的啟動模式

  Activity的啟動模式有四種:standard.singleTop. SingleTask. singleInstance。如果不在配置文件中做任何設置,將以standard模式啟動。

1,standard模式

  顧名思義,standard模式就是默認的標準啟動模式。在這種模式下,每次啟動當前Activity,就會在任務棧中創建一個當前Activity的實例。如果當前Activity多次連續啟動,則按返回鍵時,也會依次喚起已經入棧的Activity實例,表現出退出多個當前Activity的現象。

2,singleTop模式

  singleTop模式與standard模式的唯一區別是:如果要求調用Activity時,如果當前任務棧的棧頂已經時當前Activity的實例,則不會重復創建。因此,不會再調用onCreate(),onStart(),onResume()的生命周期,但是可以調用onNewIntent()回調,我們可以再這裏做一些數據處理。應用場景:註冊,登錄,避免多次點擊產生bug。

3,singleTask模式

  使用singleTask模式,如果調用Activity時,當前任務棧的棧頂已經時該Activity的實例,則singleTask模式與singleTop模式一致。如果當前任務棧中沒有Activity的實例,則會產生一個新的實例並置入棧頂。如果任務棧的下層有Activity的實例,則會把實例之上的所有其他Activity的實例全部出棧,使該Activity實例置於棧頂;表現上則是,該Activity第一次被調用後,調用的其他Activity,不能通過返回鍵返回到了。應用場景:適合作為程序入口點,例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,並且會清空主界面上面的其他頁面

4,singleInstance模式

  使用singleInstance模式,則會為當前Activity創建一個新的任務棧,並將產生的實例置入,其他Activity的實例不會置入。當在該實例下按返回鍵時,任務棧會銷毀。由於涉及到任務棧的切換,所有這種模式下的切換市場和資源銷毀比其他模式要大。這種模式一般應用與Activity與多個應用共享該Activity的情形,比如Launcher,從其他任何應用返回到Launcher,都可以保持是同一個單例。

5 Activity互相調用時的生命周期

  當Activity1中調用Activity2時,Activity1的實例首先會調用onPause回調。然後Activity2創建新的實例(或者依據啟動模式不同,從棧內調起),依次調用onCreate(),onStart(),onResume()等回調,然後Activity1調用onStop()回調。如果Activity2是從棧內調起,則其依次調用onRestart(),onStart(),onResume()回調。如果Activity1需要出棧,則其在調用onStop()回調後會調用onDestroy()回調。

基本流程如圖:

技術分享圖片

結合代碼來看,生命周期如下:

技術分享圖片

6 總結

  本節總結了Activity的4中運行狀態,基本生命周期,和啟動模式。文中demo代碼見附件。

https://files.cnblogs.com/files/acesui/ActivityDemo.rar

Android Activity生命周期及啟動模式