透彻理解startActivity

模拟一个launcher进入活动的流程


1.一开始,运行在launcher进程

2.launcher进程通过AMP切换到了system_server进程

3.system_server进程中:

一、借助PackageManager查询系统中符合要求的Activity,供用户选择

二、创建ActivityRecord对象,并检查是否正在运行app切换功能,并处理等待队列中的活动

三、为活动找到或创建TASK,并设置FLAG

四、如果不存在处于非finishing状态的活动,回到launcher

五、如果存在,把处于Resume的活动Pause

六、如果目标进程不存在,system_server向zygote发请求,zygote会fork出新进程,并运行在新进程中

4.新进程向system_server发attachApplication的请求

5.system_server进程发送scheduleLaunchActivity请求给新进程

6.新进程中,Binder线程通过Handler主线程发送H.LAUNCH_ACTIVITY请求,反射创建活动,进入生命周期


插句嘴:

1.“进入某个app的活动”,这里要有一个并列的思想。虽然你给你app中的四大组件设定了自己的启动顺序,在你眼里是有层级 顺序的,但是实际上,摆脱不了他们是并列的事实

2.(整个安卓的事件流都是主要在Launcher进程中走的)进程切换:AMP是launcher进程内置的,作为Binder Client。system_server进程中内置AMS,在ServiceManager注册成为Binder Server,这样AMP就可以远程调用AMS,简称为进程的切换


透彻理解startActivity

其实按正常思维,很好理解。几个箭头无非就是发送请求,蓝色的Binder,橙色的Sorket。

然后就要先去找吧?

然后创建一个负责活动记录的对象,也是应该的。

活动是不是要容器,task?

再把resume的给pause了,也是必须的!

如果没有进程,你运行在哪里呢?

叫zygote去创建呗

然后创建了,我这个app肯定得登记一下吧!

登记好了后,现在我就是老大了


记忆:先找找看,两个容器(task、进程),找到了,关掉原来的