Activity啓動過程的一些知識點

本文是學習 《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 屬性

用來描述它的一個專屬任務。

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