当前位置:   article > 正文

慢~再听我讲一遍Activity的启动流程_requestparentactivity

requestparentactivity

前言

activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity;二是我们在桌面通过点击应用图标启动一个App然后显示Activity;第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析。

简要

我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息。在点击应用图标时,即将要启动的App和Launcher、AMS、Zygote所属进程不同所以涉及到Launcher与AMS,AMS与Zygote,AMS与新App这四者多次通信,才会启动一个App,然后再启动Activity,整体的时序图如下:

接下来根据源码来梳理一下流程。

1.Launcher向AMS发送启动Activity

Launcher本身是一个Activity,在用户点击应用图标时,调用startActivitySafely方法,最后调用到Activity.startActivity(),函数调用如下

  1. Launcher.java
  2. public boolean startActivitySafely(View v, Intent intent, ItemInfo item) {
  3. ...
  4. //标记在新的栈启动
  5. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  6. ...
  7. startActivity(intent, optsBundle);
  8. ...
  9. }
  10. Activity.java
  11. @Override
  12. public void startActivity(Intent intent) {
  13. this.startActivity(intent, null);
  14. }
  15. @Override
  16. public void startActivity(Intent intent, @Nullable Bundle options) {
  17. ...
  18. if (options != null) {
  19. //-1为requestCode表明不需要知道是否启动成功
  20. startActivityForResult(intent, -1, options);
  21. } else {
  22. startActivityForResult(intent, -1);
  23. }
  24. }
  25. public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
  26. @Nullable Bundle options) {
  27. ...
  28. Instrumentation.ActivityResult ar =
  29. mInstrumentation.execStartActivity(
  30. this, mMainThread.getApplicationThread(), mToken,this,intent, requestCode, options);
  31. ...
  32. }

每个Activity都持有Instrumentation对象,通过它的execStartActivity函数来继续完成启动Activity的流程,这个函数中传入了mMainThread.getApplicationThread(),它获取到的是ActivityThread的内部类ApplicationThread,这是一个Binder对象,之后AMS通过此对象与App的通信。

  1. Instrumentation.java
  2. public ActivityResult execStartActivity(
  3. Context who, IBinder contextThread, IBinder token, Activity target,
  4. Intent intent, int requestCode, Bundle options) {
  5. ...
  6. int result = ActivityTaskManager.getService().startActivity(whoThread,who.getBasePackageName(),
  7. who.getAttributionTag(),intent,intent.resolveTypeIfNeeded(who.getContentResolver()),
  8. token,target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
  9. ...
  10. }
  11. ActivityTaskManager.java
  12. public static IActivityTaskManager getService() {
  13. return IActivityTaskManagerSingleton.get();
  14. }
  15. private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
  16. new Singleton<IActivityTaskManager>() {
  17. @Override
  18. protected IActivityTaskManager create() {
  19. final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
  20. return IActivityTaskManager.Stub.asInterface(b);
  21. }
  22. }
  23. };

这一步Launcher开始向AMS通信,由于在不同的进程所以需要通过Binder来通信,IActivityTaskManager是一个代理AMS端Binder的对象,之后AMS开始startActivity。 到这里Launcher向AMS请求启动一个Activity的流程就结束了。

2.AMS启动Activity并通知Launcher进入Paused状态

现在的流程是在AMS中,也就是另一个进

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/528840
推荐阅读
相关标签
  

闽ICP备14008679号