Activity啟動分析(一)--ActivityThread
1. 入口。
以前一直都說Activity的人口是onCreate方法。其實android上一個應用的入口,應該是ActivityThread。和普通的java類一樣,入口是一個main方法。
public static final void main(String[] args) {
SamplingProfilerIntegration.start();
……
Looper.prepareMainLooper();
if (sMainThreadHandler == null) {
sMainThreadHandler = new Handler();
}
ActivityThread thread = new ActivityThread();
thread.attach(false);
……
Looper.loop();
……
thread.detach();
……
Slog.i(TAG, "Main thread of " + name + " is now exiting");
}
下面仔細分析一下這個main方法。
2.Looper.prepareMainLooper();
ActivityThread其實就是我們經常說的UI thread,也就是主執行緒。我們都知道主執行緒可以使用Handler進行非同步通訊,因為主執行緒中已經建立了Looper,而這個Looper就是在這裡建立的。如果其他執行緒需要使用Handler通訊,就要自己去建立Looper。
3. sMainThreadHandler = new Handler();
建立一個Handler。
4. ActivityThread thread = new ActivityThread();
建立ActivityThread 物件。
ActivityThread 有幾個比較重要的成員變數,會在建立ActivityThread物件時初始化。
(1)final ApplicationThread mAppThread = new ApplicationThread();
ApplicationThread繼承自ApplicationThreadNative, 而ApplicationThreadNative又繼承自Binder並實現了IApplicationThread介面。IApplicationThread繼承自IInterface。這是一個很明顯的binder結構,用於於Ams通訊。IApplicationThread介面定義了對一個程式(linux的程式)操作的介面。ApplicationThread通過binder與Ams通訊,並將Ams的呼叫,通過下面的H類(也就是Hnalder)將訊息傳送到訊息佇列,然後進行相應的操作,入activity的start,
stop。
(2)final H mH = new H();
private final class H extends Handler
mH負責處理ApplicationThread傳送到訊息佇列的訊息,例如:
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);
switch (msg.what) {
case LAUNCH_ACTIVITY: {
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo);
handleLaunchActivity(r, null);
} break;
5. handleLaunchActivity(r, null);
從名字中就可以看出,這裡就將進行啟動activity的工作了。
方法中主要呼叫了這一句:
Activity a = performLaunchActivity(r, customIntent);
6. performLaunchActivity()
進行了一些初始化和賦值操作後,建立activity。
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
然後呼叫:
mInstrumentation.callActivityOnCreate(activity, r.state);
這一句就會呼叫到acitivity的onCreate方法了,就進入了大多數應用開發的入口了。
相關文章
- Activity啟動流程分析
- Activity啟動流程原始碼分析原始碼
- Android Activity啟動流程原始碼分析Android原始碼
- Android原始碼分析:Activity啟動流程Android原始碼
- Android 8.0 原始碼分析 (四) Activity 啟動Android原始碼
- Activity啟動模式模式
- Android系統原始碼分析--Activity啟動過程Android原始碼
- Android Activity Deeplink啟動來源獲取原始碼分析Android原始碼
- 一篇文章搞懂 Activity 啟動模式模式
- 一張圖弄清Activity的啟動過程
- 擼擼Android的羊毛(一)----Activity啟動模式Android模式
- Activity 從啟動到佈局繪製的簡單分析
- Activity從啟動到佈局繪製的簡單分析
- Activity啟動模式(GIF 動態演示)模式
- 深入理解Activity啟動流程和AMS框架(一)框架
- 2-AI–Activity啟動方式AI
- Android-Activity的啟動模式Android模式
- Activity生命週期與啟動模式模式
- Android程式啟動與Activity顯示Android
- 庖丁解牛 Activity 啟動流程
- 從Activity的啟動流程理解Binder
- 根Activity元件的啟動過程元件
- App 竟然是這樣跑起來的 —— Android App/Activity 啟動流程分析APPAndroid
- Activity 的 "啟動流程"(基於 Android 9.0)Android
- Android中Activity的四種啟動方式Android
- 原始碼閱讀之Activity啟動與App啟動流程 – Android 9.0原始碼APPAndroid
- 原始碼閱讀之Activity啟動與App啟動流程 - Android 9.0原始碼APPAndroid
- Android Activity是如何啟動的?Activity的生命週期是如何呼叫的?Android
- ActivityRecord、TaskRecord、ActivityStack以及Activity啟動模式詳解模式
- Activity的啟動過程第二篇
- 組內技術分享-Activity 的啟動模式模式
- Android學習筆記-Activity的啟動模式Android筆記模式
- hook 系統api啟動未註冊ActivityHookAPI
- 記一次android app啟動錯誤 Error running :Default Activity not foundAndroidAPPError
- SpringBoot啟動流程分析原理(一)Spring Boot
- Activity原始碼分析原始碼
- App 啟動過程(含 Activity 啟動過程) | 安卓 offer 收割基APP安卓
- app啟動流程,activity啟動流程時序圖,binder相關資料APP時序圖
- Activity啟動模式聯想到多程式相關的一些東西模式