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 啟動流程分析
- Activity啟動過程分析
- Activity啟動流程原始碼分析原始碼
- Android Activity啟動流程原始碼分析Android原始碼
- Android原始碼分析:Activity啟動流程Android原始碼
- Activity啟動分析(二)--建立Window和ViewView
- Android 8.0 原始碼分析 (四) Activity 啟動Android原始碼
- Activity啟動流程分析記錄(Api26)API
- Activity啟動模式模式
- 一張圖弄清Activity的啟動過程
- activity的啟動模式模式
- Android系統原始碼分析--Activity啟動過程Android原始碼
- 一篇文章搞懂 Activity 啟動模式模式
- activity四種啟動模式模式
- Activity 從啟動到佈局繪製的簡單分析
- Activity從啟動到佈局繪製的簡單分析
- Activity啟動模式(GIF 動態演示)模式
- 擼擼Android的羊毛(一)----Activity啟動模式Android模式
- Android Activity啟動三部曲(一)Android
- 2-AI–Activity啟動方式AI
- Activity的啟動模式詳解模式
- Activity啟動相關屬性
- Android Activity Deeplink啟動來源獲取原始碼分析Android原始碼
- 庖丁解牛 Activity 啟動流程
- 根Activity元件的啟動過程元件
- 從Activity的啟動流程理解Binder
- Activity生命週期與啟動模式模式
- Android-Activity的啟動模式Android模式
- Android Activity的啟動過程Android
- BroadcaseReceiver中(後臺)啟動Activity
- 啟動Activity但不顯示其介面
- Android Activity啟動模式全面解析Android模式
- Tomcat 7 啟動分析(一)啟動指令碼Tomcat指令碼
- Android程式啟動與Activity顯示Android
- Activity的生命週期和啟動模式模式
- 【Android原始碼】Activity的啟動流程Android原始碼
- Android中Activity啟動過程探究Android