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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )

發布時間:2025/6/17 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、ActivityThread 類 handleLaunchActivity -> performLaunchActivity 方法
  • 二、Instrumentation.newActivity 方法
  • 三、AppComponentFactory.instantiateActivityCompat方法
  • 四、ActivityThread.performLaunchActivity 方法后續細節
  • 五、Instrumentation.callActivityOnCreate 方法
  • 總結

前言

上一篇博客 【Android 啟動過程】Activity 啟動源碼分析 ( ActivityThread -> Activity、主線程階段 一 ) 分析了在 ActivityThread 主線程中將要調用 handleLaunchActivity 方法 , 啟動新的 Activity ;





一、ActivityThread 類 handleLaunchActivity -> performLaunchActivity 方法



在 ActivityThread 的 handleLaunchActivity 中 , 調用了 performLaunchActivity 方法 ,

在 performLaunchActivity 方法中 , 調用了 mInstrumentation.newActivity 方法 , 正式創建 Activity 實例對象 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {/*** Activity 啟動的擴展實現。當服務器請求啟動或重新啟動時使用。*/@Overridepublic Activity handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent) {// 創建頁面 , 窗口初始化WindowManagerGlobal.initialize();// 啟動 Activity 核心方法final Activity a = performLaunchActivity(r, customIntent);return a;}/** Activity 啟動的核心實現。 */private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo = r.activityInfo;ContextImpl appContext = createBaseContextForActivity(r);Activity activity = null;try {java.lang.ClassLoader cl = appContext.getClassLoader();// 正式創建 Activity 對象 activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);StrictMode.incrementExpectedActivityCount(activity.getClass());r.intent.setExtrasClassLoader(cl);r.intent.prepareToEnterProcess();if (r.state != null) {r.state.setClassLoader(cl);}} catch (Exception e) {}return activity;} }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





二、Instrumentation.newActivity 方法



在 Instrumentation 的 newActivity 方法中 , 調用了 getFactory(pkg).instantiateActivity(cl, className, intent) 方法 , 創建 Activity ;

實際調用的是 AppComponentFactory 的 Activity instantiateActivityCompat(@NonNull ClassLoader cl, @NonNull String className, @Nullable Intent intent) 方法 ;

/*** 用于實現應用程序檢測代碼的基類。* 當在啟用檢測的情況下運行時,該類將在任何應用程序代碼之前為您實例化,* 從而允許您監視系統與應用程序之間的所有交互。* 通過AndroidManifest.xml的<儀器儀表>標簽。*/ public class Instrumentation {/*** 執行流程{@link Activity}對象的實例化。默認實現提供正常的系統行為。** @param cl 用于實例化對象的類加載器。* @param className 實現活動的類的名稱對象* @param intent 指定要實例化的活動類的intent對象。** @return The newly instantiated Activity object.*/public Activity newActivity(ClassLoader cl, String className,Intent intent)throws InstantiationException, IllegalAccessException,ClassNotFoundException {String pkg = intent != null && intent.getComponent() != null? intent.getComponent().getPackageName() : null;return getFactory(pkg).instantiateActivity(cl, className, intent);}}

完整代碼參考 /frameworks/base/core/java/android/app/Instrumentation.java ;





三、AppComponentFactory.instantiateActivityCompat方法



在 AppComponentFactory 的 instantiateActivityCompat 方法中 , 通過反射創建新的 Activity ;

由于不知道要啟動哪個類 , 只能傳入一個類名稱 , 因此這里只能使用反射創建 Activity ;

/*** 使用androidx庫的{@link android.app.AppComponentFactory}版本。** 注意:這只適用于API 28+,不支持AppComponentFactory功能。*/ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {/*** 允許應用程序覆蓋活動的創建。這可以用于對這些類執行依賴項注入或類裝入器更改等操作。** 此方法僅用于提供用于實例化的掛鉤。它不提供對活動對象的早期訪問。* 返回的對象尚未初始化為上下文,不應用于與其他android API交互。** @param cl 用于實例化的默認類加載器。* @param className 要實例化的類。* @intent 創建類的意圖。*/public @NonNull Activity instantiateActivityCompat(@NonNull ClassLoader cl,@NonNull String className, @Nullable Intent intent)throws InstantiationException, IllegalAccessException, ClassNotFoundException {try {// 通過反射方式創建 Activity return (Activity) cl.loadClass(className).getDeclaredConstructor().newInstance();} catch (InvocationTargetException | NoSuchMethodException e) {throw new RuntimeException("Couldn't call constructor", e);}}}

完整代碼參考 /frameworks/support/compat/src/main/java/androidx/core/app/AppComponentFactory.java ;





四、ActivityThread.performLaunchActivity 方法后續細節



再次回到 ActivityThread 類的 performLaunchActivity 進行分析 ,

ContextImpl appContext = createBaseContextForActivity(r) 是應用中的 Context 上下文的唯一實現 ;

mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState) 代碼就是觸發調用 Activity 的 OnCreate 方法 ;

/*** 管理應用程序進程中主線程的執行、調度和執行活動、廣播以及活動管理器請求的其他操作。** {@hide}*/ public final class ActivityThread extends ClientTransactionHandler {/** Activity 啟動的核心實現。 */private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo = r.activityInfo;ContextImpl appContext = createBaseContextForActivity(r);Activity activity = null;try {java.lang.ClassLoader cl = appContext.getClassLoader();// 正式創建 Activity 對象 activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);StrictMode.incrementExpectedActivityCount(activity.getClass());r.intent.setExtrasClassLoader(cl);r.intent.prepareToEnterProcess();if (r.state != null) {r.state.setClassLoader(cl);}} catch (Exception e) {}try {Application app = r.packageInfo.makeApplication(false, mInstrumentation);if (activity != null) {activity.mCalled = false;if (r.isPersistable()) {// 調用 Activity 的 onCreate 方法 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}r.activity = activity;}mActivities.put(r.token, r);} catch (SuperNotCalledException e) {throw e;} catch (Exception e) {}return activity;} }

完整代碼參考 /frameworks/base/core/java/android/app/ActivityThread.java





五、Instrumentation.callActivityOnCreate 方法



Instrumentation 的 callActivityOnCreate(Activity activity, Bundle icicle, PersistableBundle persistentState) 方法 , 主要是調用 Activity 的 performCreate 方法 , 之后會調用 Activity 的 onCreate 方法 ;

/*** 用于實現應用程序檢測代碼的基類。* 當在啟用檢測的情況下運行時,該類將在任何應用程序代碼之前為您實例化,* 從而允許您監視系統與應用程序之間的所有交互。* 通過AndroidManifest.xml的<儀器儀表>標簽。*/ public class Instrumentation {/*** 執行對活動的{@link activity#onCreate}方法的調用。默認實現只是調用該方法。* * @param activity 正在創建的活動。* @param icicle 要傳遞到的先前凍結狀態(或null)* @param persistentState 以前的持久化狀態(或null)*/public void callActivityOnCreate(Activity activity, Bundle icicle,PersistableBundle persistentState) {prePerformCreate(activity);activity.performCreate(icicle, persistentState);postPerformCreate(activity);}}

完整代碼參考 /frameworks/base/core/java/android/app/Instrumentation.java ;


總結

截止到此處 , AMS 通過 Binder 機制調用 ActivityThread , 創建 Activity , 并調用 Activity 的 onCreate 方法 , 整個流程分析完畢 ;

總結

以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 男女三级视频 | bt天堂新版中文在线地址 | 永久精品 | a级免费观看 | 情趣五月天 | 精品美女久久久久 | 精品亚洲成人 | 玖玖爱资源站 | 国产精品16p | 性欧美丰满熟妇xxxx性久久久 | 欧美午夜久久久 | 亚洲精品日日夜夜 | 久久理论视频 | 朝鲜女人性猛交 | 91成人动漫 | 欧美乱妇18p | 欧美无马 | 午夜香蕉网 | 91亚瑟| 亚洲xx站 | 亚洲精品a区 | 99久久精品免费看国产 | 国产一区二区观看 | 1区2区3区在线观看 久久久久久久久久久影院 成人网址在线观看 | 国产在线观看中文字幕 | 欧美亚洲色图视频 | 操日韩| 99中文字幕在线观看 | 天天操天天透 | 第一av| 日韩一区二区三区在线看 | 国产山村乱淫老妇女视频 | 日韩无砖 | 懂色av一区二区三区免费观看 | 丝袜脚交免费网站xx | 超碰v| 亚洲天堂成人 | 亚洲综合激情另类小说区 | 美女免费黄色 | 精品国产人妻一区二区三区 | 亚洲午夜一区二区 | 午夜免费小视频 | aa黄色片| 欧美激情国产在线 | av999| 国产中文字幕在线观看 | 四虎精品在永久在线观看 | av地址在线观看 | 丁香花电影在线观看免费高清 | 久久久伊人网 | 中文字幕免费一区 | 国产成人观看 | 国产成人精品亚洲线观看 | 综合网久久 | 精品国产伦一区二区三 | 婷婷午夜精品久久久久久性色av | 东方av在线播放 | 欧美 日韩 视频 | 欧洲成人一区二区三区 | 九九热re| 韩国精品一区二区三区 | 国产成人在线视频网站 | 亚洲精品视频在线 | www中文字幕| 男人舔女人下部高潮全视频 | 欧美精品视 | 91禁蘑菇在线看 | 欧美高清视频 | 日韩激情电影在线 | 日韩电影网址 | 亚洲一区免费在线 | 欧美性天天 | 国产一级一片免费播放放a 丁香六月色 | 被警察猛c猛男男男 | 秘密基地免费观看完整版中文 | 99精品视频免费观看 | 双性高h1v1 | 亚色影库| 国精产品一区二区三区 | 日韩性在线 | 亚洲国产精品女人 | 色吧综合网 | 亚洲自拍在线观看 | 无遮挡在线 | 精品国产18久久久久久二百 | 亚洲图片自拍偷拍 | 日韩成人性视频 | 亚洲一区二区三区成人 | 日韩精品视频一区二区 | 亚洲av中文无码乱人伦在线视色 | 免费日韩在线 | 黑人精品一区二区三区不 | 美女被男人桶出白浆喷水 | 欧美高清免费 | 午夜两性视频 | 久久888 | 波多野结衣潜藏淫欲 | 奇米狠狠操 | 九九欧美 |