博客
关于我
慢~再听我讲一遍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基础篇(10):类、对象与构造方法
    查看>>
    python系列【仅供参考】:python测试javaSDK总结
    查看>>
    python系列【仅供参考】:python斗地主
    查看>>
    Python基础教程(第2版 修订版) pdf
    查看>>
    python基础实践(四)
    查看>>
    Python基础学习笔记(九)常用数据类型转换函数
    查看>>
    Python基础学习参考(五):字符串和编码
    查看>>
    Python基础学习
    查看>>
    python基础变量之---集合
    查看>>
    python基础变量之---字典
    查看>>
    python基础变量之---列表
    查看>>
    python基础变量之---元组
    查看>>
    python基础内容_Python基础入门必须了解的
    查看>>
    Python基础之面向对象2(封装)
    查看>>
    Python基础之给函数增加元信息
    查看>>
    python基础之字符编码
    查看>>
    python基础之多线程与多进程(二)
    查看>>
    Python基础之基本数据类型一《数字与字符串》
    查看>>
    python基础之变量---总纲
    查看>>
    Python基础之列表
    查看>>