日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探索7.x, 全面解析Activity启动框架 (1)

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探索7.x, 全面解析Activity启动框架 (1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

無論怎么說,?Activity都是Android最核心的組件, 主要負責向用戶展示應用信息. Activity的生命周期由Android系統控制, 啟動與繪制都是自動完成. 對于開發人員而言, 僅僅是一句startActivity, 就完成了全部, 但是在平凡的表象下隱藏著驚人的秘密. 讓我們撥開迷霧, 一起探索Activity的啟動框架! Know more the world, know more ourselves.


Activity

本文源碼來源Android SDK 25(即7.1), 邏輯與低版本不同. 在AMS與ASS之間又添加ActivityStarter, 負責管理Activity的啟動.

Activity的啟動框架圖


Activity的啟動框架

Activity與Instrumentation

最簡單的Activity啟動方式, 如下:

Intent intent = new Intent(this, TestActivity.class); startActivity(intent);

startActivity方法存在于Activity類中, Activity類的調用流程:

  • Activity#startActivity(Intent)
  • Activity#startActivityForResult(Intent, int, Bundle)
  • Activity#startActivityForResult核心是mInstrumentation.execStartActivity

    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,@Nullable Bundle options) {if (mParent == null) {// ...Instrumentation.ActivityResult ar =mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options); // 核心方法// ...} else {// ...} }

    Instrumentation類負責監控系統與應用之間的交互.

    execStartActivity核心是ActivityManagerNative類的getDefault#startActivity, 獲取IActivityManager單例, 本質是ServiceManager.getService("activity"), 即ActivityManagerService. 通過Binder, 遠程調用ActivityManagerService類的startActivity方法.

    public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {// ...try {// ...int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options); // 核心方法// ...} // ...return null; }

    Activity啟動通過遠程調用, 由當前應用交給ActivityManagerService(AMS)處理.


    ActivityManagerService

    ActivityManagerService類是負責啟動Activity的核心服務, 簡稱AMS. 啟動邏輯包含在ActivityStarter, ActivityStackSupervisor和ActivityStack和三個類中, ActivityStarter負責啟動, ActivityStackSupervisor負責管理Stack和TaskRecord, ActivityStack負責管理棧內的Activity.

    Stack和TaskRecord示例:

    Stack #1:Running activities (most recent first):TaskRecord{3caa65e3 #2711 A=me.chunyu.spike.wcl_activity_launchmode_demo U=0 sz=2}Run #1: ActivityRecord{36b06e99 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity t2711}Run #0: ActivityRecord{27396226 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2711}Stack #0:Running activities (most recent first):TaskRecord{27d796c9 #2695 A=com.miui.home U=0 sz=1}Run #0: ActivityRecord{2e5712cb u0 com.miui.home/.launcher.Launcher t2695}

    ActivityManagerService類的調用過程:

  • ActivityManagerService#startActivity
  • ActivityManagerService#startActivityAsUser
  • ActivityManagerService調用ActivityStarterstartActivityMayWait方法, 執行啟動.

    @Override public final int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {// ...return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,profilerInfo, null, null, bOptions, false, userId, null, null); }

    ActivityStarter類負責處理Activity的Intent和Flags的邏輯, 還有管理Stack和TaskRecord.

    ActivityStarter類的調用流程:

  • ActivityStarter#startActivityMayWait
  • ActivityStarter#startActivityLocked
  • ActivityStarter#startActivityUnchecked
  • startActivityMayWait: 根據Intent獲取Activity的啟動信息(ResolveInfo和ActivityInfo), 獲取調用者的Pid和Uid.
    startActivityLocked: 創建ActivityRecord, 含有Activity的核心信息.
    startActivityUnchecked: 根據啟動的Flag信息, 設置TaskRecord, 完成后執行ActivityStackSupervisor類的resumeFocusedStackTopActivityLocked方法, 繼續啟動.

    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) {// ...// 所有啟動準備完成后, dontStart是true.final boolean dontStart = top != null && mStartActivity.resultTo == null&& top.realActivity.equals(mStartActivity.realActivity)&& top.userId == mStartActivity.userId&& top.app != null && top.app.thread != null&& ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0|| mLaunchSingleTop || mLaunchSingleTask);if (dontStart) {ActivityStack.logStartActivity(AM_NEW_INTENT, top, top.task);// doResume是true, mDoResume也是true if (mDoResume) {mSupervisor.resumeFocusedStackTopActivityLocked();}// ...}// ... }

    ActivityStackSupervisor類ActivityStack類配合使用. ActivityStackSupervisor負責管理Task和Stack, 而ActivityStack負責管理在Stack和Task中的Activity. 因此, 對于Stack和Task的操作, AMS使用ActivityStackSupervisor進行管理; 對于Activity的操作, AMS使用ActivityStack進行管理. 兩者相互調用, 最終完成啟動Activity.

    ActivityStackSupervisor類ActivityStack類的調用流程:

  • ActivityStackSupervisor#resumeFocusedStackTopActivityLocked
  • ActivityStack#resumeTopActivityUncheckedLocked
  • ActivityStack#resumeTopActivityInnerLocked
  • ActivityStackSupervisor#startSpecificActivityLocked
  • 核心在于ActivityStack類的resumeTopActivityInnerLocked方法, 根據ActivityRecord和ActivityOptions完成Activity的切換, 移至棧頂, 最后調用ActivityStackSupervisor類的startSpecificActivityLocked方法, 執行啟動.

    ActivityStackSupervisor類的startSpecificActivityLocked方法調用realStartActivityLocked方法, 執行真正的啟動Activity.

    void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {// 獲取啟動Activity的進程, 即ApplicationProcessRecord app = mService.getProcessRecordLocked(r.processName,r.info.applicationInfo.uid, true);r.task.stack.setLaunchTime(r);if (app != null && app.thread != null) {try {// ...// 真正啟動Activity的過程realStartActivityLocked(r, app, andResume, checkConfig);return;}// ...}// ... }

    ActivityStackSupervisorrealStartActivityLocked方法中, 含有啟動的核心方法scheduleLaunchActivity, 即調用IApplicationThreadscheduleLaunchActivity方法.

    app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);

    IApplicationThread的實現是ApplicationThread, 而ApplicationThread是ActivityThread的內部類, 即使用ApplicationThread類的scheduleLaunchActivity方法處理Activity啟動.

    最終由ActivityThread完成Activity的創建與繪制.


    復雜的邏輯...

    That's all! Enjoy it!


    原文地址:?http://www.jianshu.com/p/269e3dc06b09

    總結

    以上是生活随笔為你收集整理的探索7.x, 全面解析Activity启动框架 (1)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。