天天看點

Android基礎 Activity的啟動流程

##概述:

從應用的啟動流程來看,Activity隻是一段程式的代碼,它既不是程式的入口,也不是程式的必要流程.隻是程式運作中的一個場景,一個元件.是基于Context擴充了特定功能接口的一個前台運作的場景.

AMS通過ApplicationThread的引用代理,遠端調用ApplicationThread的服務端,并通過ApplicationThread的服務端發送消息給應用程式主線程進而控制Activity的函數調用(即生命周期).

Android屬于多程序單視窗系統,隻允許當個視窗位于前台,在下一個Activity啟動之前,上一個Activity需要先Pause以失去焦點

Activty的生命周期:

Activity 的整個生命周期在三個嵌套循環中:

Activity 的整個生命周期發生在 onCreate() 調用與 onDestroy() 調用之間。您的 Activity 應在 onCreate() 中執行“全局”狀态設定(例如定義布局),并釋放 onDestroy() 中的所有其餘資源。

例如,如果您的 Activity 有一個在背景運作的線程,用于從網絡上下載下傳資料,它可能會在 onCreate() 中建立該線程,然後在 onDestroy() 中停止該線程。

*

Activity 的可見生命周期發生在 onStart() 調用與 onStop() 調用之間。在這段時間,使用者可以在螢幕上看到 Activity

例如,當一個新 Activity 啟動,并且此 Activity 不再可見時,系統會調用 onStop()。您可以在調用這兩個方法之間保留向使用者顯示 Activity 所需的資源。 例如,您可以在 onStart() 中注冊一個 BroadcastReceiver 以監控影響 UI 的變化,并在使用者無法再看到您顯示的内容時在 onStop() 中将其取消注冊。在 Activity 的整個生命周期,當 Activity 在對使用者可見和隐藏兩種狀态中交替變化時,系統可能會多次調用 onStart() 和 onStop()。

Activity 的前台生命周期發生在 onResume() 調用與 onPause() 調用之間。在這段時間,Activity 位于螢幕上的所有其他 Activity 之前,并具有使用者輸入焦點。 Activity 可頻繁轉入和轉出前台

例如,當裝置轉入休眠狀态或出現對話框時,系統會調用 onPause()。 由于此狀态可能經常發生轉變,是以這兩個方法中應采用适度輕量級的代碼,以避免因轉變速度慢而讓使用者等待。

Android基礎 Activity的啟動流程

啟動Activity時的配置:

taskAffinity屬性

預設情況下,一個應用程式中的所有activity都有一個affinity,它們屬于同一個Task。

每個activity可以通過中的taskAffinity屬性設定單獨的affinity。

不同應用程式中的activity可以共享同一個affinity。

同一個應用程式中的不同activity也可以設定成不同的affinity。

affinity屬性在2種情況下起作用:

啟動activity的Intent對象包含FLAG_ACTIVITY_NEW_TASK标記。

啟動activity的allowTaskReparenting被設定成true。

Activity啟動模式launchMode屬性有四種值:

(需要注意的是同一個應用不同Activity可以在不同棧中,不同應用Activity也可以在相同棧中,棧是相對AMS而言,不是應用程式)

standard、singleTop、singleTask和singleInstance。

standard(标準模式):預設模式,可省略。在這種啟動模式下,都會預設建立一個新的執行個體。是以,這種模式允許多個重複Activity疊加。

singleTop(棧頂複用):這種模式允許有多個執行個體,但不允許多個重複Activity疊加。如果Activity位于棧頂,不會建立新的執行個體,而會調用onNewIntent()方法。

singleTask(棧内複用):這種模式隻有一個執行個體。在同一應用程式中啟動時,若Activity不存在則在目前Task建立一個新的執行個體,若Activity存在則将Task中在其之上的其它Activity銷毀,并調用此Activity的onNewIntent()方法。

singleInstance(全局單例):這種模式隻有一個執行個體,并且該執行個體獨立運作在一個Task中。這個Task隻有該執行個體,不允許其它Activity存在。如果B應用同樣啟動目前Activity那麼将會複用原有執行個體

Activity的啟動流程(Framework版):

從調用StartActivity開始,一般情況都是有正在運作的Activity是以需要先暫停目前正在前台的Activity,

暫停完畢,會給Ams發送一個Binder消息completePause(),在該函數中,由于上一個Activity并沒有finish.僅僅是stoping,是以會把上一個Activity添加到mStopingActivites清單中

當目标Activity啟動之後依次執行attach,onCreate,onStart,onResume,在performResumeActivity()之後,通過向主程序的Looper中添加IdelHandle,當主程序MessageQueue消息為空時,向Ams發送一個請求進行記憶體清理的消息.這會導緻Ams在内部調用activityIdleInternal()方法,該方法首先會處理mStopingActivites清單中的Activity對象,這裡會調用到StopActivityLocked()方法,這會使得Ams依次通知Activty執行onStop和onDestory方法,并在最後執行trimApplication施放記憶體