应用启动流程梳理(三)-Activity启动流程

三、Activity启动流程

点击app图标,Launcher隐式启动对应的应用配置的主Activity,通过binder call向AMS发起startActivity请求。

3.1 startingWindow

在Activity启动过程中,会启动一个startingWindow作为一个过渡界面,主界面完成渲染后渐隐掉。它是一个体验的优化,会让用户感觉点击响应比较快,但是并不影响整体启动时间,官方建议是加上。

加的位置:

styles.xml

注意:windowIsTranslucent 和 windowDisablePreview不能为true,这属于主动禁止了。

应用启动流程梳理(三)-Activity启动流程_第1张图片
startingwindow触发

3.2 Activity的启动流程

启动流程主要分几步:

1)Launcher通知AMS启动Activity
Launcher发起启动Activity的请求,交由Instrumentation调用AMN与AMS进行binder call发起startActivity。

2)目标Activity启动前准备工作
通过PackageManager的resolveIntent()收集这个intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity,如果有权限, AMS会检查启动目标activity通过launchModel 和flag来配置它的task。同时如果之前存在前台Acitivity,则会让它先进入pause状态。

3)进程创建

一切就绪之后,准备启动目标Activity,在启动前会执行ActivityStackSupervisor .startSpecificActivityLocked,该方法会判断当前要启动的Activity所在的进程是否存在,如果不存在则创建进程。AMS执行startPorcessLocked向zygote发起socket请求进行fork操作,同时带过来相关参数,包括uid、gid等。另外,在应用程序进程创建过程中会启动Binder线程池,最后通过反射执行ActivityThread的main方法。

应用启动流程梳理(三)-Activity启动流程_第2张图片
进程创建流程

4)Application绑定
ActivityThread执行main方法,启动main looper,另外就是执行attach,这里又binder call到AMS执行attachApplication,然后回调到ApplicationThread执行bindApplication操作,发送消息给ActivityThread最终逻辑在handleBindApplication中,应用程序经过进程创建之后有了一个进程空壳,handleBindApplication主要任务之一是就加载目标应用的主Apk,内容包括加载.dex文件以及资源等。同时应用的Application启动并开始执行生命周期,其中onCreate()方法如果加载内容过多容易耗时。

应用启动流程梳理(三)-Activity启动流程_第3张图片
Application绑定过程

5)Activity启动
Application绑定完成之后正式进入Activity启动。ActivityStackSupervisor.realStartActivityLocked,经过IApplicationThread最终回到ActivityThread通过消息来执行启动流程。

应用启动流程梳理(三)-Activity启动流程_第4张图片
Activity启动流程

单独Activity部分的详细启动流程如下图所示:

应用启动流程梳理(三)-Activity启动流程_第5张图片
Activity部分的详细启动流程

进程间通信方案总结:

  • ActivityThread通过AMN与AMS 进行binder call。
  • AMS 通过IApplicationThread与ActivityThread进行binder call, 而ActivityThread.ApplicationThread会发消息给ActivityThread.H进行统一调度。

另外部分内容可以参看之前文章:
四大组件之Activity(一)-启动过程概览
四大组件之Activity(二)-StartingWindow流程分析
四大组件之Activity(三)- 任务栈
另外文章部分图片出处:https://www.jianshu.com/p/a5532ecc8377

你可能感兴趣的:(应用启动流程梳理(三)-Activity启动流程)