学java的都知道main函数是程序的入口,那么Android是不是也有一个类似main函数的入口呢?
答案是肯定的,在Android的源码中ActivityThread.java中,也有一个main函数public static void main(String[] args)
,那么就从这里开始找APP是如何启动的。
在main函数里可以看到这样的一段代码
public static void main(String[] args){
//准备开启一个主线程的Looper,这个mainlooper是由当前Android环境所创建的
Looper.prepareMainLooper();
//实例化当前ActivityThread对象,并调用了attach()方法
ActivityThread thread = new ActivityThread();
thread.attach(false);
...省略...
//开始循环获取消息队列
Looper.loop();
}
接着看thread.attach做了什么事
private void attach(boolean system) {
...省略...
//注意:这里很重要
//通过ActivityManager的getService()方法来获取activity管理接口对象,
//那么getService()方法又做了什么呢,
//拿到mgr后有调了attachApplication()又做了什么呢,下面会做详细的介绍
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
接着我们看看IActivityManager是怎么获取到的
/**
*跟着方法的调用可以看到这里很明显的用了单例模式,所以我们直接找单例实例化对象的地方
*/
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
//这里通过ServiceManager获取activity服务的引用
//并通过Binder跨进程通信机制来实例化IActivityManager对象
//可能到这里你会问为啥要通过Binder来获取IActivityManager,
//Binder机制在Android系统架构中大量使用,其中Activity间通信就可以使用Binder机制
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
接下来看看 mgr.attachApplication(mAppThread);做了什么事
其中mAppThread在ActivityThread中作为成员变量实例化了,当然mAppThread也是通过Binder机制来获取的
final ApplicationThread mAppThread = new ApplicationThread();
private class ApplicationThread extends IApplicationThread.Stub {}
在attachApplication()方法中只是将ApplicationThread通过Parcel打包起来,也就是说将ApplicationThread与ActivityThread关联起来。
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();
}
}
到这里我们并没有发现接下来到底是怎样执行的,在ApplicationThread中你会发现大量类似跟Activity生命周期相关的方法,那么这些是不是就是调用Activity生命周期的方法呢?
我们接着以生命周期onCreate()方法为例讲解
在这些方法里面最后都发送了Activity状态的消息,不妨猜测一下Activity生命周期的调用是通过handle消息机制来实现的
scheduleLaunchActivity
scheduleResumeActivity
scheduleDestroyActivity
@Override
public final void scheduleLaunchActivity(...省略...) {
...省略...
//发送LAUNCH_ACTIVITY消息
sendMessage(H.LAUNCH_ACTIVITY, r);
}
接下来找H的这个handler实现,每种状态都调用了以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);
//调用Launch相关的方法
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;
//调用Relaunch相关的方法
handleRelaunchActivity(r);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
...省略...
}
}
}
紧接着在handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
里面会发现调用了Activity a = performLaunchActivity(r, customIntent);
方法,继续跟着源码,在performLaunchActivity()
方法里你可以发现最终通过Instrumentation
来回调生命周期的方法
if (r.isPersistable()) {
// instrumentation是Android系统里面的一套控制方法或者“钩子”。
//这些钩子可以在正常的生命周期(正常是由操作系统控制的)之外控制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回调
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
//最终在Activity.java里面回调了onCreate()
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
mCanEnterPictureInPicture = true;
restoreHasCurrentPermissionRequest(icicle);
if (persistentState != null) {
//onCreate生命周期
onCreate(icicle, persistentState);
} else {
onCreate(icicle);
}
...省略...
}