博客
关于我
慢~再听我讲一遍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 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>
    python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
    查看>>
    Python 在并行进程之间共享字典
    查看>>
    Python 垃圾收集器文档
    查看>>
    python 基于 wordcloud + jieba + matplotlib 生成词云
    查看>>
    python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
    查看>>
    Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
    查看>>
    python 基础第七篇
    查看>>
    Python编程:Tkinter图形界面设计(1)
    查看>>
    Python 基础语法:None
    查看>>
    Python 基础语法:基本数据类型(一)
    查看>>
    python编程读取写入excel_Python读取txt内容写入xls格式excel中的方法
    查看>>
    Python 基础语法:基本数据类型(字典)
    查看>>
    Python 基础语法:基本数据类型(字符串)
    查看>>