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()