从启动一个app 到 Activity的启动过程

Launcher 调用 startActivitySafely()

主要给意图添加一个

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ///设置成

就会调用Activity里面的

startActivity

在里面会调用startActivityForResult

在startActivityForResult 会有一个是否是mParent的判断是不是根Activity

有个类 Instrumentation 主要用来监控应用程序和系统的交互

然后调用 instrumentation的 execStartActivity

里面通过ActivityManager.getService() 的方法去调用startActivity

 

 

//Laucher 和AMS 获取AMS的代理对象

看一下ActivityManager的getService的方法

这里用了IActivityManagerSingleton的单例

在API28里面用的ActivityManagerProxy的代理 方式

最后 调用的AMS 里面的startActivity

结合上面说的

 

AMS到ApplicationThread的调用过程

 

看一下AMS 里面的startActivity 。 里面调用了 startActivityAsUser 比startActicity 多了一个参数

UserHandle.getCallingUserId();//AMS通过UserId 来确定调用者多权限问题

在这个里面做两个判断和处理

1 判断调用者进程是否呗隔离

2检查调用者多权限

 

 

AMS 调用startActivity-》 startActivityAsUser

最后返回ActivityStarter 调用 startActivityMayWait

在该方法里面调用startActivityLocked的方法(在API28 中说startActivity)

最后还是调用ActivityStarter里面的startActivity的方法

重点说一下这个startActivity的方法

IApplicationThread 类型的caller 是否为空 是各种方法一路通过传值的方法传过来的

会通过ActivityRecord 记录一个Activity的所有信息这个被记录的Activity 会被作为参数传下去

在ActivityStarter的startActivity里面startActivity里面startActivityUnchecked()

 

你可能感兴趣的:(原生开发,Android)