一、简单概括启动微信的流程
1.Launcher通知AMS 要启动微信了,并且告诉AMS要启动的是哪个页面也就是首页是哪个页面
2.AMS收到消息告诉Launcher知道了,并且把要启动的页面记下来
3.Launcher进入Paused状态,告诉AMS,你去找微信吧
上述就是Launcher和AMS的交互过程
4.AMS检查微信是否已经启动了也就是是否在后台运行,如果是在后台运行就直接启动,如果不是,AMS会在新的进程中创建一个ActivityThread对象,并启动其中的main函数。
5.微信启动后告诉AMS,启动好了
6.AMS通过之前的记录找出微信的首页,告诉微信应该启动哪个页面
7.微信按照AMS通知的页面去启动就启动成功了。
二、启动流程分析
1.点击Launcher上的微信图标时
会调用startActivitySafely方法,intent中携带微信的关键信息也就是我们在配置文件中配置的默认启动页信息,其实在微信安装的时候,Launcher已经将启动信息记录下来了,图标只是一个快捷方式的入口。
startActivitySafely的方法最终还是会调用Activity的startActivity方法
而startActivity方法最终又会回到startActivityForResult方法,这里startActivityForResult的方法中code为-1,表示startActivity并不关心是否启动成功。startActivityForResult部分方法如下所示:
startActivityForResult方法中又会调用mInstrumentation.execStartActivity方法,我们看到其中有个参数是mMainThread.getApplicationThread()。
(ActivityThread是在启动APP的时候创建的,ActivityThread代表应用程序,而我们开发中常用的Application其实是ActivityThread的上下文。)
mMainThread.getApplicationThread()得到的是一个Binder对象,代表Launcher所在的App的进程,mToken实际也是一个Binder对象,代表Launcher所在的Activity通过Instrumentation传给AMS,这样AMS就知道是谁发起的请求。
2.mInstrumentation.execStartActivity方法
getService方法得到一个IActivityTaskManager,它是一个实现了IInterface的接口,里面定义了四大组件的生命周期,启动Activity时候,和AMS通信机制是AIDL方式。
3.AMS处理Launcher的信息
前面已经将Launcher所在的进程传过来了,AMS将其保存为一个ActivityRecord对象,这个对象中有一个ApplicationThreadProxy即Binder的代理对象,AMS通ApplicationTreadProxy发送消息,App通过ApplicationThread来接收这个消息。
Launcher收到消息后,再告诉AMS,好的我知道了,那我走了,ApplicationThread调用ActivityThread的sendMessage方法给Launcher主线程发送一个消息。这个时候AMS去启动一个新的进程,并且创建ActivityThread,指定main函数入口。
启动新进程的时候为进程创建了ActivityThread对象,这个就是UI线程,进入main函数后,创建一个Looper,也就是mainLooper,并且创建Application,所以说Application只是对开发人员来说重要而已。创建好后告诉AMS微信启动好了,AMS就记录了这个APP的登记信息,以后AMS通过这个ActivityThread向APP发送消息。
这个时候AMS根据之前的记录告诉微信应该启动哪个Activity,微信就可以启动了。