文化袁探索专栏——Activity、Window和View三者间关系
文化袁探索专栏——View三大流程#Measure
文化袁探索专栏——View三大流程#Layout
文化袁探索专栏——消息分发机制
文化袁探索专栏——事件分发机制
文化袁探索专栏——Launcher进程启动流程’VS’APP进程启动流程
文化袁探索专栏——Activity|Application启动流程
文化袁探索专栏——自定义View实现细节
文化袁探索专栏——线程池执行原理|线程复用|线程回收
文化袁探索专栏——React Native启动流程
android API30 分析
Activity的启动流程分析
Activity启动流程这里从三个维度分析:
1,Launcher进程中的MainActivity的启动;
2,普通APP进程中的MainActivity的启动;
3,通过Context.startActivity()方式的启动;
三个不同维度的启动流程,在开始时候的启动流程完全不同,而进入到ActivityStackSupervisor的方法realStartActivityLocked时,Acitvity启动流程则会进入统一的一致性入口。
Launcher进程MainActivity的启动
// 在AndroidManifest.xml,如何自定义桌面应用?
<intent-filter>
<action android:name=“android.intent.action.MAIN”>
<category android:name=“android.intent.category.LAUNCHER” />
<category android:name=“android.intent.category.HOME”/>
<category android:name=“android.intent.category.DEFAULT”/>
</intent-filter>
/**ProcessList.jva*/
boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
int zygotePolicyFlags, boolean disableHiddenApiChecks, boolean disableTestApiChecks,
boolean mountExtStorageFull, String abiOverride) {
... ....
// Start the process. It will either succeed and return a result containing
// the PID of the new process, or else throw a RuntimeException.
final String entryPoint = "android.app.ActivityThread";
// 启动进程并设置进程入口类,entryPoint = "android.app.ActivityThread";
return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
instructionSet, invokeWith, startTime);
.........
}
当Launcher进程创建成功后,zygote进程会通过JNI方式调用ZygoteInit.java,进而调用ActivityThread#Main方法。开启Looper循环,使主线程具有消息分发能力。初始化ActivityThread。ActivityThread调用attach方法,
thread.attach(false, startSeq);
// ActivityThread.attach
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread, startSeq);//进入ams系统服务层
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
在ActivityThread的attach方法中,会执行ActivityMananerService的方法attachApplication方法,向AMS注册自己,同时传递IApplicationThreadBinder对象以便于AMS能够对四大组件进行调度。然后在AMS中由 ATMS#LocalService调用了attcachAplication方法,查看栈顶部是否有Activity在等待启动。然后有则进入到ATMS中,并经RootWindowContainer.attachApplication()、startActivityForAttachedApplicationIfNeeded方法调用,将Activity的启动交给了ActivityStackSupervisor。就此进入所有Activity启动的统一入口方法realStartActivityLocked。
private boolean startActivityForAttachedApplicationIfNeeded(ActivityRecord r,
WindowProcessController app, ActivityRecord top) {
try {//ActivityStackSupervisor执行启动Activity的逻辑
if (mStackSupervisor.realStartActivityLocked(r, app, top == r /*andResume*/,
true /*checkConfig*/)) {
mTmpBoolean = true;
}
} catch (RemoteException e) {...}
}
在方法realStartActivityLocked中,又会将Activity的启动交给ClientLifeCycleTransaction安排启动事务。
// ActivityStackSupervior.java
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
再交由ClientTransaction调度事务,并将事务发送给ApplicatioinThread,由此将触发实际的事务调度。
// ClientTransaction.java
public void schedule() throws RemoteException {
mClient.scheduleTransaction(this);
}
// ActivityThead$ApplicationThread.java
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
ActivityThread.this.scheduleTransaction(transaction);
}
然后就从在ApplicationThread切换到了ActivityThread ,由于ActivityThread 实现自ClientTransactionHandler。
public final class ActivityThread extends ClientTransactionHandler
在ClientTransactionHandler中通过发送Message消息,并能被ActivityThread$H 捕获。进而触发下面的ActivityThread.performLaunchActivity()方法。ActivitityThread#performLaunchActivity主要负责执行来自AMS对Activity创建调度的执行。
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
将Activity的真实创建交给Instrumentation,通过newActivity反射创建。
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
Activity实例创建成功后,调用attach开启生命周期。
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback,
r.assistToken);
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
普通APP进程MainActivity的启动
通过Context.startActivity()方式的启动
Application启动流程参照Activity可以从两个维度分析:
1,Launcher进程中的Application的启动;
2,APP进程中的Application的启动;
这里先叙述Activity的启动流程,在三种维度下是如何进行启动的。…待续…