博客
关于我
慢~再听我讲一遍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基础——线程锁
    查看>>
    python基础——线程与进程
    查看>>
    Python基础——构造方法和特殊成员方法
    查看>>
    Python基础——多线程值从Thread类继承
    查看>>
    Python基础——多线程之信号量
    查看>>
    Python基础——_thread多线程
    查看>>
    Python基础——Thread类与线程对象
    查看>>
    Python基础——Thread创建管理多线程
    查看>>
    Python基础——SQLite数据库基本操作
    查看>>
    Python基础——MySQL数据库基本操作
    查看>>
    Python基础_列表 list
    查看>>
    python系列【仅供参考】:python异步库调用gevent和asyncio对比
    查看>>
    python基础3
    查看>>
    Python基础08 面向对象的基本概念
    查看>>
    python系列【仅供参考】:python二进制转10进制
    查看>>
    Python基础-函数篇
    查看>>
    python基础---->常用模块
    查看>>
    Python基础(2):控制结构
    查看>>
    Python基础 | 关于“循环”那些事
    查看>>