透彻理解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,简称为进程的切换
图
其实按正常思维,很好理解。几个箭头无非就是发送请求,蓝色的Binder,橙色的Sorket。
然后就要先去找吧?
然后创建一个负责活动记录的对象,也是应该的。
活动是不是要容器,task?
再把resume的给pause了,也是必须的!
如果没有进程,你运行在哪里呢?
叫zygote去创建呗
然后创建了,我这个app肯定得登记一下吧!
登记好了后,现在我就是老大了
记忆:先找找看,两个容器(task、进程),找到了,关掉原来的