我們學(xué)習(xí) Android 過程中會(huì)發(fā)現(xiàn),我們的文件都是 .java 文件,也就是說 Android 開發(fā)還是用的 Java 語言來編寫的。也正是這樣,所以你們來學(xué) Android ,也會(huì)讓你們先學(xué)習(xí)一段時(shí)間 Java 。掌握好了 Java 的相關(guān)知識(shí),學(xué)起 Android 來可謂是事半功倍。好了,你們是不是感覺有點(diǎn)扯遠(yuǎn)了啊,不是說好講 ActivityThread 類的么,其實(shí)并不如此。
你們?cè)趧傞_始從 Java 學(xué)習(xí)轉(zhuǎn)到 Android 學(xué)習(xí)的過程中,有一個(gè)重大的改變不知道你們又沒有發(fā)現(xiàn)。那就是 Java 中的 main() 方法,程序的入口不見了,取而代之的是 onCreate() 方法。你們沒有一點(diǎn)疑惑么?初學(xué)階段直接無腦接受是對(duì)的,但是作為一個(gè)工作幾年了的人來說,就有必要去深入研究一下了。明明 Android 也就是 Java 語言也編寫的,差別咋就這么大呢?
其實(shí)呢, Android 中還是有 main() 方法的,只是隱藏的比較深而已。今天,就由我 AIqingfeng 來帶你們一探究竟~!
我們先找到 ActivityThread 這個(gè)類,看一下注釋(較少,值得一看):
This manages the execution of the main thread in an
application process, scheduling and executing activities,
broadcasts, and other operations on it as the activity
manager requests.
翻譯一下就是:在 Application 進(jìn)程中管理執(zhí)行主線程,調(diào)度和執(zhí)行 活動(dòng)和廣播,和活動(dòng)管理請(qǐng)求的其它操作。
一、入口
Android 上一個(gè)應(yīng)用的入口,應(yīng)該是 ActivityThread 類,和普通的Java 類一樣,入口是一個(gè) main() 方法。
public static void main(String[] args) {
// 看源碼很重要的一個(gè)能力就是‘眼中只有你’,認(rèn)不到的都忽略,看認(rèn)得到的
···
// 創(chuàng)建主線程的Looper對(duì)象,發(fā)現(xiàn)和工作線程創(chuàng)建Looper對(duì)象調(diào)用的方法不一樣,這里先記下,以后在詳解。
// 主線程原來也有Looper對(duì)象啊
Looper.prepareMainLooper();
// 這里創(chuàng)建了一個(gè)活動(dòng)線程,也就是我們的主線程。
ActivityThread thread = new ActivityThread();
thread.attach(false);
// 如果主線程的Handler為空(可以看出,一個(gè)好的命名可讀性是多么高),那就為主線程創(chuàng)建一個(gè)Handler。
// 然后我們還可以在主線程創(chuàng)建Handler,說明一個(gè)線程對(duì)應(yīng)多個(gè)Handler。多讀源碼,很多問題都得到了解決啊。
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
Looper.loop();
// 這里拋了個(gè)異常,主線程loop異常退出。說明主線程loop不能退出,這里和前面建立Looper對(duì)象的調(diào)用方法有關(guān)
throw new RuntimeException("Main thread loop unexpectedly exited");
}
二、變量
好了,現(xiàn)在我們解決了我們開始的疑惑后,再來深度學(xué)習(xí)一下這個(gè)類的一些知識(shí)吧。
ActivityThread 有幾個(gè)比較重要的成員變量,會(huì)在創(chuàng)建ActivityThread對(duì)象時(shí)初始化。
final ApplicationThread mAppThread = new ApplicationThread();
ApplicationThread繼承自ApplicationThreadNative, 而ApplicationThreadNative又繼承自Binder并實(shí)現(xiàn)了IApplicationThread接口。IApplicationThread繼承自IInterface。這是一個(gè)很明顯的binder結(jié)構(gòu),用于與Ams通信。IApplicationThread接口定義了對(duì)一個(gè)程序(Linux的進(jìn)程)操作的接口。ApplicationThread通過binder與Ams通信,并將Ams的調(diào)用,通過下面的H類(也就是Hnalder)將消息發(fā)送到消息隊(duì)列,然后進(jìn)行相應(yīng)的操作,入activity的start, stop。
final H mH = new H();
這個(gè) H 大家首先會(huì)想到什么啊,不要開車哈。看到 H 想到了 Handler 。發(fā)現(xiàn) H 是 ActivityThread 內(nèi)部類,繼承自 Handler ,果然沒錯(cuò)。所以大家遇到不清楚的,不要怕,大膽的猜測(cè)一下。Handler 最重要的的也就是 handleMessage() 方法了。查看一下其方法:
ActivityThread.java
public void handleMessage(Message ms ) {
switch (msg.what) {
// 呀哈,這些看著和 onCreate() 、onResume() 、onStop() 方法有很大關(guān)系啊。
case LAUNCH_ACTIVITY: {
// 處理加載活動(dòng),這里進(jìn)去就可以得到答案啦。
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
} break;
case RESUME_ACTIVITY:
case STOP_ACTIVITY:
}
}
點(diǎn)進(jìn)來咯。 ActivityThread.java
private void handleLaunchActivity(···) {
// 執(zhí)行加載活動(dòng),返回一個(gè)活動(dòng)對(duì)象。有興趣可以在進(jìn)去看看。
Activity a = performLaunchActivity(r, custonIntent);
}
興趣是最好的老師。ActivityThread.java
private Activity performLaunchActivity(···) {
Activity activity = null;
try {
// 活動(dòng)在這里被創(chuàng)建,還可以進(jìn)去看看。認(rèn)不到的單詞google一下,Instrumentation : 儀器。
activity = mInstrumentation.newActivity(···);
}
if (r.isPersistable()) {
// 看名字就感覺調(diào)用了 Activity 的 onCreate() 方法
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
}
先探索一下 Activity 創(chuàng)建這條路吧。最底層啦。Instrumentation.java
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, illegalAccessException, ClassNotFoundException {
// 類加載器根據(jù)類名創(chuàng)建了一個(gè)實(shí)例。再下去就是native方法了。
return (Activity) cl.loadClass(className).newInstance();
}
Native方法,C語言啦,活動(dòng)創(chuàng)建之路結(jié)束了。Class.java
public native T newInstance() throws InstantiationException, IllegalAccessException;
再來看看 Activity 中 onCreate() 方法執(zhí)行之路吧。 Instrumentation.java
public void callActivityOnCreate(Activity activity, Bundle icicle,
PersistableBundle persistentState) {
// pre: 前,執(zhí)行 Create 操作之前
prePerformCreate(activity);
// 執(zhí)行 Create 操作
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
到了 Activity 了,哪里我們自己 Activity 還遠(yuǎn)么~! Activity.java
final void performCreate(Bundle icicle) {
restoreHasCurrentPermissionRequest(icicle);
// 哼哼,終于找到你了,onCreate() 方法。
onCreate(icicle);
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
來,仔細(xì)瞅瞅~! Activity.java
@MainThread // 主線程
@CallSuper // 必須調(diào)用super.onCreate(bundle);
protected void onCreate(@Nullable Bundle savedInstanceState) {
// 看這里,是不是我們恢復(fù)數(shù)據(jù)那些操作啊,看看源碼怎么寫的~!
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
// Activity 中管理的 Fragment
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
// 分發(fā) Create 操作
mFragments.dispatchCreate();
}