博客
关于我
慢~再听我讲一遍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及pycharm2018软件安装教程
    查看>>
    python去重txt文本_Python实现的txt文件去重功能示例
    查看>>
    python去掉列表的逗号,从Python列表项中删除标点符号
    查看>>
    Python卸载所有包
    查看>>
    python单线程下实现多个socket并发
    查看>>
    Python单元测试框架介绍(超详细~)
    查看>>
    Python单元测试框架
    查看>>
    python单元测试之unittest
    查看>>
    Python单元测试unittest实战
    查看>>
    Python单元测试-模拟VS补丁
    查看>>
    python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
    查看>>
    Python十进制&;包提供错误的结果
    查看>>
    Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
    查看>>
    Python加速运行技巧
    查看>>
    python办公自动化基础遍历文件夹
    查看>>
    python办公自动化基础输出文件和文件夹
    查看>>
    python办公自动化基础搜索文件
    查看>>
    python知识:@classmethod和@staticmethod的异同
    查看>>
    python前端之css
    查看>>
    Python制作进度条,原来有这么多方法
    查看>>