學(xué)java的都知道m(xù)ain函數(shù)是程序的入口州邢,那么Android是不是也有一個類似main函數(shù)的入口呢袖瞻?
答案是肯定的,在Android的源碼中ActivityThread.java中煞躬,也有一個main函數(shù)public static void main(String[] args)
肛鹏,那么就從這里開始找APP是如何啟動的逸邦。
在main函數(shù)里可以看到這樣的一段代碼
public static void main(String[] args){
//準備開啟一個主線程的Looper,這個mainlooper是由當(dāng)前Android環(huán)境所創(chuàng)建的
Looper.prepareMainLooper();
//實例化當(dāng)前ActivityThread對象,并調(diào)用了attach()方法
ActivityThread thread = new ActivityThread();
thread.attach(false);
...省略...
//開始循環(huán)獲取消息隊列
Looper.loop();
}
接著看thread.attach做了什么事
private void attach(boolean system) {
...省略...
//注意:這里很重要
//通過ActivityManager的getService()方法來獲取activity管理接口對象在扰,
//那么getService()方法又做了什么呢,
//拿到mgr后有調(diào)了attachApplication()又做了什么呢,下面會做詳細的介紹
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
接著我們看看IActivityManager是怎么獲取到的
/**
*跟著方法的調(diào)用可以看到這里很明顯的用了單例模式缕减,所以我們直接找單例實例化對象的地方
*/
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
//這里通過ServiceManager獲取activity服務(wù)的引用
//并通過Binder跨進程通信機制來實例化IActivityManager對象
//可能到這里你會問為啥要通過Binder來獲取IActivityManager,
//Binder機制在Android系統(tǒng)架構(gòu)中大量使用健田,其中Activity間通信就可以使用Binder機制
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
接下來看看 mgr.attachApplication(mAppThread);做了什么事
其中mAppThread在ActivityThread中作為成員變量實例化了烛卧,當(dāng)然mAppThread也是通過Binder機制來獲取的
final ApplicationThread mAppThread = new ApplicationThread();
private class ApplicationThread extends IApplicationThread.Stub {}
在attachApplication()方法中只是將ApplicationThread通過Parcel打包起來,也就是說將ApplicationThread與ActivityThread關(guān)聯(lián)起來妓局。
public void attachApplication(IApplicationThread app) throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken("android.app.IActivityManager");
_data.writeStrongBinder(app != null ? app.asBinder() : null);
this.mRemote.transact(11, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
到這里我們并沒有發(fā)現(xiàn)接下來到底是怎樣執(zhí)行的总放,在ApplicationThread中你會發(fā)現(xiàn)大量類似跟Activity生命周期相關(guān)的方法,那么這些是不是就是調(diào)用Activity生命周期的方法呢好爬?
我們接著以生命周期onCreate()方法為例講解
在這些方法里面最后都發(fā)送了Activity狀態(tài)的消息局雄,不妨猜測一下Activity生命周期的調(diào)用是通過handle消息機制來實現(xiàn)的
scheduleLaunchActivity
scheduleResumeActivity
scheduleDestroyActivity
@Override
public final void scheduleLaunchActivity(...省略...) {
...省略...
//發(fā)送LAUNCH_ACTIVITY消息
sendMessage(H.LAUNCH_ACTIVITY, r);
}
接下來找H的這個handler實現(xiàn),每種狀態(tài)都調(diào)用了以handle***開頭的方法存炮。
private class H extends Handler {
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
public static final int PAUSE_ACTIVITY_FINISHING= 102;
...省略...
public void handleMessage(Message msg) {
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
//調(diào)用Launch相關(guān)的方法
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case RELAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
//調(diào)用Relaunch相關(guān)的方法
handleRelaunchActivity(r);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
...省略...
}
}
}
緊接著在handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
里面會發(fā)現(xiàn)調(diào)用了Activity a = performLaunchActivity(r, customIntent);
方法炬搭,繼續(xù)跟著源碼,在performLaunchActivity()
方法里你可以發(fā)現(xiàn)最終通過Instrumentation
來回調(diào)生命周期的方法
if (r.isPersistable()) {
// instrumentation是Android系統(tǒng)里面的一套控制方法或者“鉤子”穆桂。
//這些鉤子可以在正常的生命周期(正常是由操作系統(tǒng)控制的)之外控制Android控件的運行宫盔,
//其實指的就是Instrumentation類提供的各種流程控制方法
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
//Instrumentation類
public void callActivityOnCreate(Activity activity, Bundle icicle,
PersistableBundle persistentState) {
prePerformCreate(activity);
//這里控制onCreate回調(diào)
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
//最終在Activity.java里面回調(diào)了onCreate()
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
mCanEnterPictureInPicture = true;
restoreHasCurrentPermissionRequest(icicle);
if (persistentState != null) {
//onCreate生命周期
onCreate(icicle, persistentState);
} else {
onCreate(icicle);
}
...省略...
}