Activity生命週期、啓動模式和工作過程

Activity生命週期、加載模式和工作過程

說好的一週兩篇還是被連着加班沒實現,囧- -!  馬上要離職了,要趕緊總結了,今天通過平常的瞭解和查閱資料,總結了Android開發中最重要的組件---Activity

Activity是用來與用戶進行交互的界面,一個app給用戶的所有功能都是通過它展現給用戶的,很重要!!!

 Activty的生命週期:

(1)onCreate:activity正在被創建,第一個方法可以進行初始化工作、如加載佈局文件

(2)onStart:activity正在啓動,當前已經可見但是沒有焦點不能進行交互。

(3)onResume:activity已經可見顯示到前臺可以進行交互這時候如果用戶打開新的activity或home,回調onPause-》onStop。

(4)onPause:activity正在停止
(5)onStop:activity即將停止,返回調用onRestart,回到onStart

(6)onDestory:當前Activity銷燬

(7)onRestart:在onStop中返回activity調用onRestart,回到onStart




當activity異常情況下銷燬並重新創建,比如內存不足後臺activity被殺死,橫豎屏切換等,在onStop之前系統會調用onSavaInstance方法來保存當前activity的狀態數據,它可能在onPause之前也可能是之後 。當系統重新創建activity,系統會調用oncreate、onStart之後onRestoreInstanceState方法把之前保存的狀態數據Bundle對象作爲參數傳遞給RestoreInstanceState和onCreate進行重建。


Activity的啓動模式:

(1)standard 標準模式也是Activity的默認啓動模式,每次啓動activity都會創建一個實例,誰啓動了activit那它就會運行在啓動它的所在哪個棧裏。

(2)singleTop: 棧頂複用模式,如果activity已經位於任務棧的棧頂不會被重新創建,同時它的onNewIntent方法會被回調,可以通過這個方法的參數取出當前的請求信息。

(3)singleTask:棧內複用模式,單實例模式,只要棧內存在這個activity多次啓動都不會重新創建實例。

(4)singleInstance:單實例模式,加強的棧內複用模式就是activity單獨位於一個任務棧內。

activity跳轉返回保存狀態信息,一般保存是在onPause()回調方法中進行。 也可以調用startActivityforResult()方法把將狀態信息通過setResult()返回給原來的,比如音樂播放器中在onActivityResult()中繼續播放。


Activity的工作過程

Activity的方式最常見無非是startActivity方法,這個方法有好幾個重載方式。但是最終都會調用sartActivityForResult()。通過判斷mParent != null來啓動。mParent代表ActivityGroup  API 13已經被廢棄了,用fragment來代替。

    接着調用Instrumention的execStartActivity(),可以發現Activity的啓動實際上是由ActivityManagerService(AMS)完成的。ams繼承自amNative,AMS也是一個    binder對象它採用的是單例模式對外提供。最終是AMS的startActivity()方法執行

    instrumention的execStartActivity方法中有以個checkActivityResult檢查啓動Activity的結果,如果無法正確啓動就會拋出異常信息。

    AMS的startActivity()中有調用了ActivityStackSupervisor的StartActvityMayWait接着七轉八轉到ActivityStack中的resumeTopActivity方法中。IApplicationThread這個Binder接口的實現者完成了大量的Activity和service的啓動和停止相關的功能。在轉轉的,到ApplicationThread調用schedleLaunchActivity方法來啓動,這個方法很簡單就是發送了一個啓動activity的消息給Handler H處理。performLaunchActivity最終完成了Activity的創建和啓動。這個方法是如何工作的呢?

    1,獲取需要被啓動的Activity的組件信息  2,通過Instrumentation的newActivity方法使用類加載器創建對象 3,通過LoadedApk的makeApplication創建application對象  4,通過contextImpl對象的attach方法完成一些重要數據的初始化  contextImpl很重要它是context的具體實現,在attch中會完成window的創建並關聯。
    5,最後調用onCreate方法完成創建  (呼呼呼呼   出一下氣————————)











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章