【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、主线程阶段 二 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 启动过程】Activi
- 下一篇: 【Android 启动过程】Activi