博客
关于我
慢~再听我讲一遍Activity的启动流程
阅读量:96 次
发布时间:2019-02-26

本文共 7109 字,大约阅读时间需要 23 分钟。

Android Activity??????

??

???????????????????????????????????????????????????????????Activity??????????????????????????????????Android??????????????

??????

?????Launcher Activity????????????????????Launcher?????startActivitySafely??????????Activity?????????????????AMS?ActivityManagerService??Zygote?????????????????????????????

  • Launcher?AMS??????
  • AMS????Activity???Launcher??Paused??
  • ?????????ActivityThread
  • ActivityThread??????Application
  • ???????Activity
  • ?????????????????

    1. Launcher?AMS??????

    Launcher???????????????????????????????????????????????Launcher???startActivitySafely????????startActivity(Intent intent)?????????

    public boolean startActivitySafely(View v, Intent intent, ItemInfo item) {      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);      startActivity(intent, optsBundle);      return true;  }  public void startActivity(Intent intent, @Nullable Bundle options) {      if (options != null) {          startActivityForResult(intent, -1, options);      } else {          startActivityForResult(intent, -1);      }  }  public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {      Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(          this, mMainThread.getApplicationThread(), mToken,          intent, requestCode, options);      // ????  }

    ???????????startActivity??????Instrumentation?execStartActivity??????????AMS??????????????????Activity?????Instrumentation????Instrumentation??Binder?AMS???

    2. AMS??Activity???Launcher??Paused??

    AMS????????????Binder?Zygote??????????????????????????

    public int startActivity(IApplicationThread caller, String callingPackage, String callingFeatureId,      Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,      int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {      return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,          resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId);  }  public int startActivityAsUser(IApplicationThread caller, String callingPackage, String callingFeatureId,      Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,      int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {      // ????      userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,          Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");      return getActivityStartController().obtainStarter(intent, "startActivityAsUser")          .setCaller(caller)          .setCallingPackage(callingPackage)          .setCallingFeatureId(callingFeatureId)          .setResolvedType(resolvedType)          .setResultTo(resultTo)          .setResultWho(resultWho)          .setRequestCode(requestCode)          .setStartFlags(startFlags)          .setProfilerInfo(profilerInfo)          .setActivityOptions(bOptions)          .setUserId(userId)          .execute();  }  ActivityStarter.java  int execute() {      // ??ActivityStack.java??startActivity??  }  ActivityStack.java  private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {      // ??Launcher??Paused??  }  ActivityStackSupervisor.java  void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {      // ???????      final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid);      if (wpc != null && wpc.hasThread()) {          try {              realStartActivityLocked(r, wpc, andResume, checkConfig);          } catch (RemoteException e) {              // ????          }      }      // ??????      r.notifyUnknownVisibilityLaunchedForKeyguardTransition();      final boolean isTop = andResume && r.isTopRunningActivity();      mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");  }

    ???????????AMS??ActivityTaskManagerService?Zygote?????????Zygote???????????????????ActivityThread?main???

    3. ???????ActivityThread?main????

    Zygote???????????????????????ActivityThread?main???ActivityThread?main???????Looper?ActivityThread????????????AMS??

    public static void main(String[] args) {      // ???Looper      Looper.prepareMainLooper();      // ??ActivityThread?attach      ActivityThread thread = new ActivityThread();      thread.attach(false, startSeq);      // ????      Looper.loop();  }  ActivityThread.java  private void attach(boolean system, long startSeq) {      final IActivityManager mgr = ActivityManager.getService();      try {          mgr.attachApplication(mAppThread, startSeq);      } catch (RemoteException ex) {          ex.rethrowFromSystemServer();      }      // ??Application      bindApplication();  }  ActivityManagerService.java  private boolean attachApplicationLocked(IApplicationThread thread, int pid, int callingUid, long startSeq) {      // ??Application      thread.bindApplication(processName, appInfo, providerList, instr2.mClass, profilerInfo, instr2.mArguments, instr2.mWatcher, instr2.mUiAutomationConnection, testMode, enableTrackAllocation, isRestrictedBackupMode, app.isPersistent(), config, compatInfo, services, coreSettings, buildSerial, autofillOptions, contentCaptureOptions, disabledCompatChanges);      // ??onCreate      didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());  }

    ???????????ActivityThread?main??????????????????????AMS???????????????

    4. ??Activity

    ??????????????????????????Activity?ActivityStackSupervisor?????????????????Activity???

    public final void bindApplication(String processName, ApplicationInfo appInfo, ProviderInfoList providerList, ComponentName instrumentationName, ProfilerInfo profilerInfo, Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher, IUiAutomationConnection instrumentationUiConnection, int debugMode, boolean enableBinderTracking, boolean trackAllocation, boolean isRestrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map services, Bundle coreSettings, String buildSerial, AutofillOptions autofillOptions, ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) {      // ??BIND_APPLICATION??      sendMessage(H.BIND_APPLICATION, data);  }  public void handleMessage(Message msg) {      switch (msg.what) {          case BIND_APPLICATION:              AppBindData data = (AppBindData) msg.obj;              handleBindApplication(data);              Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);              break;          // ??case      }  }  private void handleBindApplication(AppBindData data) {      // ??Application?onCreate??      mInstrumentation.callApplicationOnCreate(app);  }

    ???????????ActivityStackSupervisor??????????????????Activity??????????

    ??

    ????????????????Android????????????????????????????Activity????????????????????Launcher?AMS?Zygote??ActivityThread??????????????Android????????????

    ???????????????????Android??????????????????Activity??????????????Android??????????

    转载地址:http://lkyz.baihongyu.com/

    你可能感兴趣的文章
    Python图形处理
    查看>>
    python+flask计算机毕业设计高校物品使用互益平台的设计与实现(程序+开题+论文)
    查看>>
    Python函数,匿名函数,高阶函数,内置函数——08
    查看>>
    python+flask计算机毕业设计高校疫情防控管理平台(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校网上迎新系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校运动会(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校选课系统(程序+开题+论文)
    查看>>
    Python+Jenkins+Allure Report接口自动化测试持续集成
    查看>>
    python+locust电商全流程性能测试
    查看>>
    Python函数运行的可执行文件的终端输出如何以一般方式静音?
    查看>>
    Python+Pytest+Allure+Git+Jenkins接口自动化框架
    查看>>
    python+pytest接口自动化 —— 参数关联
    查看>>
    python+pytest接口自动化 —— 参数关联
    查看>>
    Python+pytest接口自动化 —— 接口测试基础
    查看>>
    python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
    查看>>
    Python+pytest接口自动化之cookie绕过登录(保持登录状态)
    查看>>
    python+pytest接口自动化:接口测试
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    python+requests+unittest执行自动化接口测试!
    查看>>