Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 是怎麼啟動一個Acitivity的?

Android 是怎麼啟動一個Acitivity的?

編輯:關於Android編程

可以把啟動過程分為client端和server端。

一、client端在啟動一個Activity時進行的工作

備注:我個人理解,client端指的是相對後台ActivityManagerService 進程來說的前台用戶可見的進程,如在界面啟動某一個Activity的就是Laucher進程。這裡則以從home桌面啟動一個Activity來分析啟動過程:

(1)Launcher 這個進程的主線程,在捕獲onClick點擊事件後,調用 startActivitySafely 方法, startActivitySafely 方法內部調用了

startActivity 方法,然後,startActivity方法進而調用Launcher的父類Activity的 startActivity方法;

(2)Activity.startActivity方法 調用startActivityForResult 方法,傳入該方法 的requestCode 參數為 -1 ,表示 Activity啟動成功後,不需要執行 Lanucher.onActivityResult方法處理返回結果;startActivityForResult方法內部需要調用 Instrumentation 的 execStartActivity方法。Instrumentation 對象是用於監控應用程序和系統(主要是 Activity Manager )的交互過程。

(3)execStartActivity方法會把將要啟動的Activity相關信息傳送到ActivityManagerService 如果 ActivityMonitor 對啟動Activity 進行檢查沒問題,那麼會調用 ActivityManagerNative.getDault 得到ActivityManagerProxy代理對象,然後調用該代理對象的startActivity方法。;

(4)調用ActivityManagerProxy代理對象的startActivity方法實際上是調用 BinderProxy.transact向 Binder驅動發送 START_ACTIVITY_TRANSACTION命令,此時就從Lanucher進程切換到ActivityManagerService進程了。

總結上述四步:源Activity(這裡是Launcher)所屬進程通過一系列方法,(無論是通過Launcher來啟動Activity,還是通過Activity內部調用startActivity接口來啟動新的Activit,都通過Binder進程間通信進入到ActivityManagerService進程中,並且調用ActivityManagerService.startActivity接口;


二、Lanucher進程處理Activity的啟動請求,就是Client端的工作,傳遞給 Server端的 ActivityManagerService 後。就是ActivityManagerService 進程的處理過程 了。

處理過程將分為 7個階段

1、第一階段——預啟動檢查

這個階段,主要工作是檢查是否有權限啟動該Activity,查詢系統中是否存在指定Intent的Activity, 檢查Intent是否正確,檢查當前能否切換Activity,各種檢查通過後創建目標Activity的ActivityRecord, 判斷是否有可復用的Task 或者Activity ,有則關聯ActivityRecord,無則新建Task ,更新 ActivityManagerService中Task的數量,檢查回退棧頂是否有顯示的Activity,有則暫停。

2、第二階段——暫停

這個階段的主要工作就是暫停啟動目標 Activity的源Activity,比如,我是從Actvity A啟動Activity B的,那麼在啟動B之前需要把A暫停,

針對暫停的Activity的後續處理,要麼是執行destroy 操作,要麼是存入等待stop列表;

3、第三階段——創建目標Activity所運行的進程

准備切換動畫,查詢ActivityManagerService 的mProcessNames變量中是否存在指定的進程信息,有則復用,直接啟動Activity,無則通過zygote啟動一個新的進程。進程啟動超時時間一般是10s。

4、第四階段——加載應用程序Activity

進程入口是 ActivityThread 的main方法,main方法裡的主要工作是設置臨時進程名,創建 UI主線程ActivityThread ,並調用其attach方法,最後進入主線程的消息循環。接下來的工作是為低內存設備禁用硬件加速,創建應用程序對應的Application, 並初始化,安裝 Content Provider,執行Instrumentation的onCreate方法,執行Application的 onCreate方法。

5、第五階段——顯示Acitivity

在ActivityManagerService 所在進程向應用程序主線程的消息循環發送 LANUCHER_ACTIVITY消息,然後在主線程中回調Activity生命周期的onCreate, onStart,onResume等方法來顯示 Activity,onResume方法執行完畢後,需要先把當前顯示Activity所在的Task加入最近Task列表,然後才返回ActivityManagerService作後續處理。(在onResume方法之前,還可能會先回調onNewIntent 和 onActivityResult方法)


6、第六階段——處理處於空閒狀態的Activitiy

包括移除ActivityStack消息循環中的超時MSG,停止待停止列表總得Activity,銷毀待銷毀的Activity,如果是系統啟動階段,還要發送一個ACTION_BOOT_COMPLETEED廣播,回收待回收應用程序進程等。最重要的一個操作就是停止源Activity


備注:此文是讀書所得,主要歸納於老羅的《Android 源代碼情景分析》和楊雲君老師的《Android的設計與實現I》。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved