幾個(gè)重要的類:
ActivityThread:
App啟動(dòng)的真正入口。當(dāng)Zygote進(jìn)程孵化出一個(gè)新的應(yīng)用進(jìn)程后,后執(zhí)行ActivityThread的main方法。Instrumentation:
它用來監(jiān)控應(yīng)用程序和系統(tǒng)的交互。真正做事的是ActivityManagerNative.getDefault()。-
ActivityManagerService(AMS)、ActivityManagerNative、 ActivityManagerProxy、ActivityManager:
1. ActivityManagerNative是一個(gè)抽象類繼承Binder,實(shí)現(xiàn)IActivityManger接口
public abstract class ActivityManagerNative extends Binder implements IActivityManager
gDefault.get()返回的就是IActivityManager,如果實(shí)在客戶端調(diào)用就是返回的ActivityManagerProxy對(duì)象。2. ActivityManagerProxy是ActivityManagerNative同文件的類,不是內(nèi)部類,兩個(gè)類都在同一個(gè)文件中, 實(shí)現(xiàn)IActivityManager接口 3. ActivityManagerService繼承了ActivityManagerNative類 ActivityMangerProxy遠(yuǎn)程調(diào)用方法后,先到ActivityManagerService類中的onTransact方法,該方法中調(diào)用 super.onTransact調(diào)用父類ActivityManagerNative的onTransact方法,最終都會(huì)調(diào)用ActivityManagerService中的方法 4. ActivityManager作為中介來訪問IActivityManager提供的功能。 ActivityManager是通過ActivityManagerNative.getDefault()來獲取到IActivityManager這個(gè)接口的。 因?yàn)锳ctivityManager是運(yùn)行在用戶進(jìn)程的,因而getDefault()獲取的是ActivityManagerProxy. ApplicationThread,ApplicationThreadNative,IApplicationThread:
ApplicationThread是ActivityThread的內(nèi)部類,繼承ApplicationThreadNative;
ApplicationThreadNative抽象類繼承Binder實(shí)現(xiàn)IApplicationThread;
用于和AMS進(jìn)行通信。ApplicationThread通過binder與Ams通信,并將Ams的調(diào)用,
通過H類(也就是Hnalder)將消息發(fā)送到消息隊(duì)列,然后進(jìn)行相應(yīng)的操作。
ActivityThread的main方法:
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
Looper.loop();
ActivityThread的attach方法: 只寫主要的代碼
final IActivityManager mgr = ActivityManagerNative.getDefault();
//這個(gè)mgr的對(duì)象是ActivityThreadProxy,最終調(diào)用的是AMS中的方法
try {
//mAppThread是ApplicationThread的對(duì)象
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
ActivityMangerService的attachApplication:
attachApplication():
attachApplicationLocked(thread, callingPid);
//通過binder,跨進(jìn)程調(diào)用ApplicationThread的bindApplication()方法, 下面代碼邏輯重回ActivityThread.java
thread.bindApplication();
mStackSupervisor.attachApplicationLocked(app)
realStartActivityLocked();//啟動(dòng)Activity
ApplicationThread的bindApplication:
bindApplication():
sendMessage(H.BIND_APPLICATION, data);
//通過mH把BIND_APPLICATION消息發(fā)給H處理
//使用H的目的是,把代碼執(zhí)行的邏輯從binder線程池里的線程切換到main線程里去執(zhí)行.
mH.sendMessage(msg);
ActivityThread中的H
private class H extends Handler {
...
public static final int BIND_APPLICATION = 110;
...
public void handleMessage(Message msg) {
switch (msg.what) {
...
case BIND_APPLICATION:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);//調(diào)用ActivityThread的handleBindApplication()方法處理
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
...
}
}
}
ActivityThread中的handleBindApplication
// 以下兩個(gè)方法都是設(shè)置進(jìn)程名稱
Process.setArgV0(data.processName);
//可以通過反射DdmHandleAppName類中的getAppName方法獲取進(jìn)程名稱
android.ddm.DdmHandleAppName.setAppName(data.processName,UserHandle.myUserId());
data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
//創(chuàng)建app運(yùn)行時(shí)的上下文對(duì)象,并對(duì)其進(jìn)行初始化.
final ContextImpl appContext = new ContextImpl();
appContext.init(data.info, null, this);
//這里的data.info是LoadedApk類的對(duì)象
//在這里創(chuàng)建了上層開發(fā)者的代碼中所涉及的Applicaiton類的對(duì)象
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
...
//如果有ContentProvider的話, 先加載ContentProvider,后調(diào)用Application的onCreate()方法
List<ProviderInfo> providers = data.providers;
if (providers != null) {
installContentProviders(app, providers);
}
//調(diào)Application的生命周期函數(shù) onCreate()
mInstrumentation.callApplicationOnCreate(app);
// LoadedApk.java
public final class LoadedApk {
...
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
Application app = null;
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
return app;
}
...
}
// Instrumentation.java
public class Instrumentation {
...
public void callApplicationOnCreate(Application app) {
app.onCreate();
}
...
}