https://blog.csdn.net/u012267215/article/details/91406211
一、当在手机屏幕上点击app的图标的时候,此时手机屏幕就是Activity,而这个actiity所在的app就是称为launcher。Launcher是各个厂商提供的。
而Launcher为每个app的图标提供了启动这个app的所需要的intent的信息,
action:android.intent.action.MAIN
category:android.intent.category.LAUNCHER
cmp:包名+activity名
Launcher和图标所代表的的app是在两个进程,它们之间的通信就是通过Binder完成,这时候需要AMS。
整体流程:
①Launcher通知AMS,要启动app
②Launcher得到通知后,并记录要启动的app的首页。
③Launcher进入paused状态,然后通知AMS
④AMS检查app是否已经启动了,如果是,那么就进行唤起,否则就启动一个新进程,在新进程中创建ActivityThread对象,启动其中的main()方法。
⑤app启动成功后,就通知AMS。
⑥AMS会找到之前记录的要启动的页面,通知app要启动哪个。
⑦app启动首页,创建Context和首页的Activity关联,调用首页Activity的onCreate函数。
源码中遇到的关键类:
Instrumentation: 仪表盘
ActivityThread
H:就是handler
LoadedApk
AMS
ActivityManagerNative和ActivityManagerProxy
ApplicationThread和ApplicationThreadProxy
二、源码分析
Launcher启动app的时候,也是调用的startActivty()方法,最终调用的是startActivtyForResult()方法。
这里是用instrumentation调用的execStartActivity(),这里有个很重要的参数getApplicationThread()就是获取的主线程,它在app启动的时候就创建了,代表了App应用程序。Application就是ActivtyThread的上下文。
mToken也是一个Binder对象,表示Launcher这个activity也通过Instrumentation传递给了AMS。以后AMS想通知Launcher也是他通过这两个参数。
在Instrumentation中的execStartActivity方法,这样就将activity的数据传递给了ActivityManager。
1.app应用的真正入口是ActivityThread类中的main()方法。
2.调用Looper.prepareMainLooper()方法。
3.调用prepare(false)方法,这里的threadLocal其实就是一个map集合。这样新创建了一个Looper对象,添加到集合中。
在Looper的构造器中,初始化了消息队列并且获取当前的线程
4.调用myLooper()方法,将存储在集合中的Looper对象取出来
5.在ActivityThread类中的main()方法中创建了ActivityThread的对象后调用attach()方法,这里传递的参数system是false,因此只查看非系统的部分。
6.在这里的ActivityManagerNative类中,才是真正的管理Activity、Service等的地方,在这里有startActivity() startSerVice()等等的方法。在ActivityManagerNative.getDefault()方法中返回的是ActivityManagerService()类。
7.在调用ActivityManagerService中的attachApplication()方法
8.在调用attachApplicationLocked()方法中,其中重要方法为bindApplication(),主要是进行绑定给thread数据
9.在StackSupervisor类中,调用attachApplicationLocked()方法,并且调用readlStartActivityLocked()方法,进行真正的启动activity
10.在realStartActivityLocked()方法中进行启动activity
11.调用在ActivityThread中的scheduleLaunchActivity()方法。
12.在handler H中
13.在performLauchAcitivity()方法中处理具体的Activity的启动逻辑,在这里创建了Activity的对象,并且调用了oncreate()方法
14.调用Instrumentation类中的Activity的onCreate()方法
对于同一个app内的activity的创建,和App的启动流程基本一致。因为不需要重新创建进程,所以在这里有些不同。