当我们点击桌面图标的时候,会通过Launch应用,启动另外一个进程来启动当前应用的activity。那么这个activity的启动流程是怎样的呢?当然这一部分分为两个关键点:
- application启动
- activity启动
一、application启动
首先进入ActivityThread.java类。找到main()方法
1、ActivityThread.java----->main()方法,伪代码如下:
public static void main(String[] args) {
...
Looper.prepareMainLooper();
...
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
使用了Handler,looper消息机制,并且初始化了ActivityThread对象,调用了attach方法。
2、ActivityThread.java----->attach()方法,伪代码如下:
@UnsupportedAppUsage
private void attach(boolean system, long startSeq) {
...
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread, startSeq);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
...
}
使用了Binder机制,得到了ActivityManagerService的服务端代理类,调用attachApplication()方法,就会跨进程调动服务端的该方法。进入ActivityManagerService.java类。
3、ActivityManagerService.java----->attachApplication()方法,伪代码如下:
@Override
public final void attachApplication(IApplicationThread thread, long startSeq) {
synchronized (this) {
...
attachApplicationLocked(thread, callingPid, callingUid, startSeq);
...
}
}
间接调用attachApplicationLocked()方法。
4、ActivityManagerService.java----->attachApplicationLocked()方法,伪代码如下:
@GuardedBy("this")
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid, int callingUid, long startSeq) {
...
final ActiveInstrumentation instr2 = app.getActiveInstrumentation();
//1、第一步
thread.bindApplication(processName, appInfo, providers,
instr2.mClass,
profilerInfo, instr2.mArguments,
instr2.mWatcher,
instr2.mUiAutomationConnection, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.isPersistent(),
new Configuration(app.getWindowProcessController().getConfiguration()),
app.compat, getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial, autofillOptions, contentCaptureOptions);
...
if (normalMode) {
try {
//2、第二步
didSomething = mAtmInternal.