APP的启动流程分析
2021-12-23 本文已影响0人
XX杰
/**
- 1、ActivityThread 中的 main 方法
- 2、thread.attach(false, startSeq);
// ActivityManager.getService 通过 IBinder(AIDL) 获取 系统 的 ACTIVITY_SERVICE
IActivityManager mgr = ActivityManager.getService();
mgr.attachApplication(mAppThread, startSeq);
- 3、因为 attachApplication 方法, 所以 mAppThread 可以被 mgr 知道, 所以可以被系统知道
mAppThread 就是 ApplicationThread
- 4、ActivityManagerService 中实现了 attachApplication 方法
在其中调用 attachApplicationLocked 然后 调用 ApplicationThread 中 的 bindApplication
在 ActivityThread 中通过 他的 Handler 消息机制 调用 handleBindApplication 方法
/**
final ClassLoader cl = instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
- 5、 handleBindApplication 方法中 mInstrumentation.callApplicationOnCreate 调用 application 的 onCreate
- 6、 当Application初始化完成后,系统会根据 Manifests 中的配置的启动 Activity 发送一个Intent去启动相应的Activity
https://www.cnblogs.com/huan89/p/14111363.html
这里有一个问题 : 我没看过 launcher 是如何启动一个 app 的 通过上面的网址可以得知
是 launcher 调用了 系统服务进程 AMS 的 startActivity 方法。但是不太明白,launcher 的调用顺序是怎么样的
(是根据什么判断先走了 ActivityThread 中的 main 方法,启动了 application, 在调用了 startActivity)
- 7、前提:假如上面的 网址成立
AMS 中 的 startActivity 方法。 然后 ActivityStarter 类中 的 execute 方法 --> startActivity 方法
--> startActivityUnchecked 方法
接着 进入 ActivityStackSupervisor 类中的 resumeFocusedStackTopActivityLocked 方法 根据activity的状态 判断
进入 ActivityStack 中的 resumeTopActivityUncheckedLocked 方法 --> resumeTopActivityInnerLocked
ActivityStackSupervisor 中的 realStartActivityLocked
再次回到 ActivityStack 中的 resumeTopActivityUncheckedLocked --> resumeTopActivityInnerLocked
再回到 ActivityStackSupervisor startSpecificActivityLocked --> realStartActivityLocked
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
根据上面的方法 ClientLifecycleManager 类中的 scheduleTransaction 方法
getLifecycleManager() 是 AMS 中的 方法
- 8、 ClientTransaction 中 持用 IApplicationThread 这样的话 scheduleTransaction
这样的话 又 回到 了 ActivityThread extends ClientTransactionHandler 中的方法 通过 Handler 发送消息
在Handler 中 对 TransactionExecutor 进行 事务 的处理 execute --> executeLifecycleState
LaunchActivityItem 中的 client.handleLaunchActivity(r, pendingActions, null // customIntent)
就是 ActivityThread 中的 handleLaunchActivity 方法 就启动 activity 了
- 9、 启动 activity 的方法 依旧是 类加载器 performLaunchActivity 中的 mInstrumentation.newActivity
mInstrumentation.callActivityOnCreate(activity, r.state)
*/