版本:27.1.1
本文只做一个主线的分析。
先上activity启动的流程总图,分两大块分析:
有看过源码的android 朋友都应该熟悉,ActivityThread中的main方法是启动点。下面看下main方法里究竟做了什么?
public static void main(String[] args) {
// ....省略N行代码
// 得到ActivityThread实例如并调用 attach方法
ActivityThread thread = new ActivityThread();
thread.attach(false);
// ....省略N行代码
}
private void attach(boolean system) {
sCurrentActivityThread = this;
mSystemThread = system;
if (!system) {// true代表系统,false:应用
// ....省略N行代码
// 获取了 IActivityManager管理类 getService()请看 分析->getService()
final IActivityManager mgr = ActivityManager.getService();
try {
// 关联ApplicationThread 分析->ApplicationThread
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
// ....省略N行代码
} else {
// ....省略N行代码
}
}
// 分析->ApplicationThread
// 初始化ApplicationThread,存放activity的信息,以及提供一些有关activity声明周期的方法
ApplicationThread mAppThread = new ApplicationThread()
// 这里不带贴具体源码,会在activity加载以及完成生命周期的分析中贴出
// 分析->getService()
/**
* @hide
*/
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
// 获取binder对象。可以看出使用了binder通信机制
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
// 根据binder找到IActivityManager。结合上一行代码可以看出ActivityManager是用系由统服务调用管理的
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
小结: 通过以上源码可以确定,源码中用到了binder通信机制
,由此可知ActivityManager管理类是由系统服务调用管理。这里我们可以知道Activity是跨进程访问的
。
最后会通过 mgr.attachApplication(mAppThread)
关联ApplicationThread
到这里主要的启动已经完成,我们需要去关注ApplicationThread做了什么?
请看下面分析!
相关类:ActivityThread内部类(ApplicationThread 、H)
、Instrumentation、Activity
private class ApplicationThread extends IApplicationThread.Stub {
// ....省略N行代码
// 启动Activity的方法
@Override
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
int procState, Bundle state, PersistableBundle persistentState,
List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
// ....省略N行代码
// 发送启动activity消息
sendMessage(H.LAUNCH_ACTIVITY, r);
}
// ....省略N行代码
}
由启动方法的流程可知:
当Activity状态发生变化时,会调用到这里,有这里发送Message消息进行通知状态的的更新。
2. H
小结:由上面源码可以看出,这里启动Activity是利用Handler通信机制完成
,
分析->handleLaunchActivity()
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
// ...省略N行代码
Activity a = performLaunchActivity(r, customIntent);
// ...省略N行代码
}
分析->performLaunchActivity()
相信看到这里就可以知道整个activity的启动流程了
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
// ...省略N行代码
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
// ...省略N行代码
return activity;
}
后面就不再分析贴源码了,后面的流程:callActivityOnCreate() -> activity.performCreate() -> onCreate();
分析过程中的核心点:
Binder通信机制
handler消息机制
整体流程核心步骤:
attach
去获取IActivityManager管理类,然后调用attachApplication
实现IActivityManager与ApplicationThread的绑定ServiceManager.getService(Context.ACTIVITY_SERVICE)
得到一个Binder接口
,根据binder获取返回的IActivityManager
启动方法、生命周期完成方法
,完成调用Handler机制
去通知相关activity状态的更新H
类中的handleMessage
去处理这些消息,完成响应的操作完结! 点个赞吧