編輯:關於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》。
加入到你的項目中去在 Module 下的 build.gradle 中,加上下面這句:compile 'com.github.youngkaaa:navigati
好的APP應當具備良好的交互, 最好能貼心的滿足用戶的需求. 而人性化的提醒就是其中之一. 某些APP中經常會看到這樣的場景, 當加載內容失敗, 或者獲取內容失敗時, 界
Android提供了兩種事件處理的方式:基於回調的事件處理 和 基於監聽的事件處理。 我們來說的容易理解一點:(1)基於回調的事件處理就是繼承GUI組件,並重寫
前言Handler是Android消息機制的上層接口,平時使用起來很方便,我們可以通過它把一個任務切換到Handler所在的線程中去運行。而最常用的就是拿來從子線程切換到