思考如下问题:
1、Android9和之前版本startActivity的差异?
2、为什么startActivity是异步的?
3、为什么安卓Looper死循环不会导致UI卡死?
Android从9.0版本开始修改了启动Activity部分流程, 跟以往版本的主要区别在于使用Transaction并删除了ActivityThread内部类H中100~109的code。
从Android8.0开始使用AIDL替换Binder实现系统进程(SystemServer)和应用进程之间的通讯。
Android9.0版本startActivity后会在clientTransaction.addCallback函数传入LaunchActivityItem对象。
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
}
......
clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, mService.isNextTransitionForward(),
profilerInfo));
....
}
Android9.0以前版本直接调用ActivityThread的scheduleLaunchActivity方法发送LAUNCH_ACTIVITY消息。
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
......
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
// TODO: Have this take the merged