您的位置:首页 > 其它

同一进程activity中启动另一个activity的流程

2018-01-01 15:02 375 查看
在上一篇文章launcher界面点击应用图标启动Activity流程分析 中我们分析了在新进程中启动activity的流程,这里我们也顺便介绍下在同一个进程的activity中启动另一个activity,这种场景在实际应用中应该更为常见。都是启动activity,这两种场景有什么区别呢?其实也没什么大的差别,主要是在新进程中启动activity时AMS要先创建一个新进程然后才在新进程中完成activity的启动,而在同一进程中启动activity就无需这一步–新的activity直接在原有进程中启动。

这里启动activity的主要流程分为三步:

第一步:launcher进程通知AMS自己想要启动一个应用的主activity,其中Launcher和AMS的通信使用了跨进程技术,流程图如下,其中ActivityManagerProxy是AMS的远程接口;



第二步:AMS收到启动activity的请求后会调整一下自身的状态(为后面启动新的activity做准备)并要求Launcher当前栈顶的activity进入pause状态,流程图如下,其中ApplicationThreadProxy是ApplicationThread的远程接口;



第三步:Launcher pause完当前栈顶activity后通知AMS可以开始启动新activity了,准备就绪后AMS会通过ApplicationThread的远程接口ApplicationThreadProxy来调用scheduleLaunchActivity通知新进程开始真正启动activity的工作了,activity的onCreate和onResume函数都是在ActivityThread的handleLaunchActivity中完成的;



至此,同一进程的activity中启动另一个activity的流程走完了。

详细的代码流程与launcher界面点击应用图标启动Activity流程分析 文中的大致一样,主要是在14步:ActivityStackSupervisor.startSpecificActivityLocked 中走的不一样,在同一个进程中启动activity时判断条件if (app != null && app.thread != null)将为true,从而直接走realStartActivityLocked函数而后会直接调用ApplicationThreadProxy.scheduleLaunchActivity通知应用进程完成activity的启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: