文章目录 一、Activity 启动源码分析 ( AMS | ActivityManagerService ) 1、Instrumentation 调用 AMS 方法 2、ActivityStarter 调用 AMS 方法 3、Process 启动新进程 二、Activity 启动源码分析 ( ActivityStarter ) 1、ActivityStarter.startActivityMayWait () 方法 2、ActivityStarter.startActivity ( 24 参数 ) 方法 3、ActivityStarter.startActivity ( 23 参数 ) 方法 4、ActivityStarter.startActivity ( 9 参数 ) 方法 5、ActivityStarter.startActivityUnchecked 方法 6、ActivityStarter.computeLaunchingTaskFlags( 方法 , 在 ActivityStarter 中的 startActivityMayWait 中 , 调用了 24 个参数的 startActivity 方法 , class ActivityStarter
源码分析 /frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java a、obtainStarter 方法分析 调用 ActivityStartController 的 obtainStarter 方法 , 得到的是 ActivityStarter 方法 , Activity 的启动是由该 ActivityStarter It is valid until after * {@link ActivityStarter#execute} is invoked. . */ ActivityStarter obtainStarter(Intent intent, String reason) { return mFactory.obtain ().setIntent(intent).setReason(reason); } } b、execute 方法分析 Activity 启动过程很复杂 , 封装在 ActivityStarter
ActivityManagerService.startActivityAsUser()//execute() 【--->ActivityStarter.java】 ActivityStarter.execute () // ActivityStarter.startActivityMayWait() // ActivityStarter.startActivity() // ActivityStarter.startActivityUnchecked
接着调用了obtainStarter ,该方法通过工厂模式创建了 ActivityStarter 对象,如下所示: #ActivityStarter.java static class DefaultFactory //同步池 private SynchronizedPool<ActivityStarter> mStarterPool = new SynchronizedPool<> obtain() { //从同步池中获取 ActivityStarter 对象 ActivityStarter starter = mStarterPool.acquire 对象,该对象创建完成之后,该对象创建完成之后,AMTS 就会将接下来启动 Activity 的操作交给 ActivityStarter 来完成。 #ActivityStarter.java //根据前面传入的参数解析一下必要的信息,并开始启动 Activity int execute() { try { int res;
lauchModle 检测: ActivityStarter.startActivityUnchecked() 绕过AndroidManifest检测: 瞒天过海:使用代理Activity替换原来的
return res; } } ActivityStarter是Android 7.0新加入的类,它是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为 ActivityStarter的startActivityMayWait方法调用了startActivityLocked方法,如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java int startActivityLocked frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java private int startActivity frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java private int startActivity
frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ? frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ? frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ? 接着又调用startActivityUnchecked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
ActivityA startActivity --> startActivityAsUser -- > mActivityStarter.startActivityMayWait 这里会调用到类 ActivityStarter how an intent and flags should be turned into * an activity and associated task and stack. */ class ActivityStarter 从注释上看,我们了解了ActivityStarter的作用是收集所有的逻辑,用来决定如何启动activity, ActivityStarter又通过ActivityStackSupervisor来管理
It is valid until after * {@link ActivityStarter#execute} is invoked. ().setIntent(intent).setReason(reason); } 跟踪ActivityStarter代码, ActivityStarter这个类看名字就知道它专门负责一个 Activity /** * An interface that to provide {@link ActivityStarter} instances to the controller. * @return an {@link ActivityStarter} */ ActivityStarter obtain(); /** * Recycles a starter for reuse. */ void recycle(ActivityStarter starter
NotificationRemoteInputManager.Callback.class); mShadeController = Dependency.get(ShadeController.class); final ActivityStarter activityStarter = Dependency.get(ActivityStarter.class); // 用于处理通知相关的各种交互,例如点击通知后跳转个某个应用等交互 mCommandQueue, mAssistManager, mNotificationPanel, mPresenter, mEntryManager, mHeadsUpManager, activityStarter
原因 在ActivityStarter.startActivityUnchecked函数中,在找到要启动的Activity所保存的TaskRecord后,会来处理该标识位: // ActivityStarter.isDocumentLaunchesIntoExisting(launchFlags)) { if (!
同时交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。 ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有: 寻找符合启动条件的Activity,如果有多个,让用户选择; 校验启动参数的合法性 bOptions, false, userId, null, "startActivityAsUser"); } 调用了startActivityMayWait方法进入到了ActivityStarter options, ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason); } ActivityStarter
在startActivityAsUser方法中,会通过Starter池获取到一个ActivityStarter对象,然后设置一些参数,最后调用execute方法执行Activity的启动。 ActivityStarter 顾名思义,ActivityStarter类就是为了启动Activity的。
同时交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。 ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有: 寻找符合启动条件的Activity,如果有多个,让用户选择; 校验启动参数的合法性 bOptions, false, userId, null, "startActivityAsUser"); } 调用了startActivityMayWait方法进入到了ActivityStarter options, ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason); } ActivityStarter
validateIncomingUser, Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser"); // 使用ActivityStarter .setActivityOptions(bOptions) .setUserId(userId) .execute(); } 2.2 ActivityStarter 执行启动 源码位置: frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java // ActivityStarter.java
在startActivityAsUser方法中,会通过Starter池获取到一个ActivityStarter对象,然后设置一些参数,最后调用execute方法执行Activity的启动。 ActivityStarter 顾名思义,ActivityStarter类就是为了启动Activity的。
同时交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。 ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有: 寻找符合启动条件的Activity,如果有多个,让用户选择; 校验启动参数的合法性 bOptions, false, userId, null, "startActivityAsUser"); } 调用了startActivityMayWait方法进入到了ActivityStarter options, ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason); } ActivityStarter
接下来通过系统源码来查看FLAG的应用,在Android深入四大组件(一)应用程序启动过程(后篇)中讲过,根Activity启动时会调用AMS的startActivity方法,经过层层调用会调用ActivityStarter frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ? frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ?
ActivityStarter.startActivityMayWait(System_Server进程) 通过Instrumentation.execStartActivity经过IPC调用,调用到AMS 的startActivity,进入后该函数后,会调用到ActivityStarter.startActivityMayWait 通过PackageManagerService解析intent找到对应的ActivityInfo sourceRecord, voiceSession, voiceInteractor, startFlags, true, options, inTask, outActivity); ActivityStarter.startActivityUnchecked
在构造函数中,主要初始化了一些对象,比如Context、ActivityThrad、Handler、CPU监控线程,还有一些后文要用到的ActivityStackSupervisor、ActivityStarter 接着看启动流程,通过Binder调用到了AMS的startActivity方法,然后会调用到ActivityStarter的startActivity方法,在这个方法中,我们发现一个新的类: //ActivityStarter.java