本文是學習 《Android 系統源代碼情景分析》 Activity啓動過程筆記
在學習Activity啓動過程中,調用的方法類,一個接着一個,剛開始看是看完了,但是還是暈暈乎乎的,之後總結問題在於,這個過程中的好多概念都沒有理解,最後把常用的都總結一下,再次學習就流暢多了。下邊是自己發現的幾個學習源碼非常好博客,推薦給大家
名稱 | 地址 | 描述 |
---|---|---|
http://weishu.me | http://weishu.me | 內有 Android 插件化原理解析系列文章 |
Gityuan博客 | http://gityuan.com/ | 內容十分豐富 |
老羅的Android之旅 | http://blog.csdn.net/Luoshengyang | 學Android,看老羅 |
ActivityManagerService AMS
幾個重要的參數:
caller:指向Launcher 組件所運行在的應用程序進程的ApplicationThread對象
intent:包含了即將啓動的Activity的信息
resulTo:指向ActivityManagerService內部的一個ActivityRecoder對象,它裏面保存了Launcher
組件的詳細信息
在ActivityManagerService中,每一個Activity組件都有一個用戶ID和一個進程名稱;
UID是ActivityManagerService分配的,
PID而進程名稱則是由該Activity組件的android:process
屬性來決定的
Intrumentation
用來監控應用程序和系統之間的交互操作
weishu Android插件化原理解析——Hook機制之動態代理 代理Hook hock的就是 Intrumentation 可以實現知道當運行的是哪一個Activity.
/**
* Base class for implementing application instrumentation code. When running
* with instrumentation turned on, this class will be instantiated for you
* before any of the application code, allowing you to monitor all of the
* interaction the system has with the application. An Instrumentation
* implementation is described to the system through an AndroidManifest.xml’s
* <instrumentation> tag.
*/
ActivityThread
用來描述一個應用程序進程。系統每當啓動一個應用進程時,都會在它裏邊加載一個ActivityThread實例,並且將這個ActivityThread類實例保存在每一個該進程中啓動的Activity組件的父類Activity的成員變量mMainThread中內部對象 {內部類} ApplicationThread
ApplicationThread
Binder本地對象
ActivityManagerService 就是通過它和應用程序進行通信的
mToken
Activity 成員變量 mToken 的類型爲IBinder,它是一個Binder代理對象,指向了ActivityManagerService中一個類型爲ActivityRecoder 的Binder 本地對象, 這個ActivityRecoder 和ActivityClientRecord (在應用程序進程中使用)一樣,都是用來描述啓動的Activity組件的
ActivityRecoder
每一個已經啓動的ActivityManagerService 中都有一個對應的ActivityRecoder對象,用來維護對應Activity組件的運行狀態
以及信息有一個成員變量app 類型爲ProcessRecord
描述Activity組件所運行在的應用程序進程。成員 thread 類型爲ApplicationThreadProxy 用來描述一個Binder代理對象,引用的是一個類型爲ApplicationThread的Binder本地對象
ActivityStack
用來描述一個Activity組件堆棧
mService 指向ActivityManagerService
mHistory :
同一個任務中所以Activity 組件都是連在一起的
8.ActivityInfo
ProcessRecrd
在ActivityManagerService中每一個應用進程都使用一個ProcessRecord對象描述,並保存在ActivityManagerService中。
描述Activity組件所運行在的應用程序進程。
成員變量thread :是一個Binder代理對象,它指向了用來運行MainActivity組件的應用程序進程的一個ApplicationThread 對象
ActivityClientRecoder
在應用程序進程中的每一個Activity組件都使用一個ActivityClientRecord對象來描述
ApplicationThreadProxy
Binder 代理對象
LoadedApk
ContextImpl
每一個Activty組件啓動的時,ActivityThread 類都會爲它創建一個ContectImpl對象,用來描述它運行的上下文環境。
這個ContextImpl對象就保存在這個Activity組件父類ContextWrapper的成員變量mBase中
ContextWrapper
mBase Context 類型 指向一個ComtextImpl對象
PackageManagerService
系統啓動時會啓動一個Package管理服務PackageManagerService,並通過它來安裝系統中的應用程序。
PackageManagerService在安裝一個應用程序過程中會對它的配置文件AndroidManifest.xml進行解析,
從而得到它裏邊的組件信息
Launcher
系統啓動後會將,Launcher組件啓動起來。Launcher組件啓動過程中,會向PackageManagerService
查詢所有Action名稱爲
category 名稱爲
的Activity組件,最後爲每一個組件創建一個圖標,並將它們的信息與各自的圖標關聯起來
ActivityManagerNative
getDefault 獲取ActivityManagerService 的一個代理對象
Activity 組件 android:taskAffinity 屬性
用來描述它的一個專屬任務。