文章目录
一、 Activity 中的 getApplication() 方法分析
二、 ActivityThread 中的 H 处理 消息及 handleLaunchActivity 方法操作
三、 ActivityThread 中的 performLaunchActivity 方法
四、 LoadedApk 中的 mApplication 成员
五、 ActivityThread 涉及源码
六、 Instrumentation 涉及源码
七、 LoadedApk 涉及源码
一、 Activity 中的 getApplication() 方法分析
在 Activity 中调用 getApplication() 方法 , 获取 Application 的过程分析 ;
下面就是调用的 Activity 的 getApplication() 方法 , 其获取的是 Application mApplication 成员 ;
而 mApplication 成员是在 attach() 方法中赋值的 ;
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback, AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient { @UnsupportedAppUsage private Application mApplication; /** Return the application that owns this activity. */ public final Application getApplication() { return mApplication; } @UnsupportedAppUsage final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident, Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer, IVoiceInteractor voiceInteractor, Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) { attachBaseContext(context); mApplication = application; } }
参考源码路径 : frameworks/base/core/java/android/app/Activity.java
二、 ActivityThread 中的 H 处理 消息及 handleLaunchActivity 方法操作
在 ActivityThread 中 , 创建并启动一个 Activity , H ( Handler 子类 ) 接到一个 LAUNCH_ACTIVITY 消息 , 在相应的处理该 LAUNCH_ACTIVITY 消息的 handleMessage 方法中 , 调用了 handleLaunchActivity 方法 ;
public final class ActivityThread { private class H extends Handler { public static final int LAUNCH_ACTIVITY = 100; public void handleMessage(Message msg) { if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); switch (msg.what) { case LAUNCH_ACTIVITY: { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); final ActivityClientRecord r = (ActivityClientRecord) msg.obj; r.packageInfo = getPackageInfoNoCheck( r.activityInfo.applicationInfo, r.compatInfo); // ★ 调用 handleLaunchActivity 方法处理该消息 handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } break; } // switch } // handleMessage } // private class H extends Handler }
参考路径 : frameworks/base/core/java/android/app/ActivityThread.java
三、 ActivityThread 中的 performLaunchActivity 方法
handleLaunchActivity 方法中调用了 performLaunchActivity 方法 , 在该方法中通过 mInstrumentation.newActivity 创建 Activity , Instrumentation 创建 Activity 是通过反射进行的 ;
performLaunchActivity 方法中创建了 Activity 后 , 就调用了 Activity 的 attach 方法 , 为 Activity 中的 Application mApplication 成员赋值 ;
activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window, r.configCallback);
在调用的 activity.attach 中第六个参数 app 就是设置的 Application , app 的创建代码如下 , 这里是传入 Activity attach 方法中的 Application , 赋值给 Activity 中的 mApplication 成员 , packageInfo 就是 LoadedApk , LoadedApk 的 makeApplication 直接使用的就是 LoadedApk 中的 mApplication 成员 ;
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
主要源码 :
public final class ActivityThread { private class H extends Handler { public static final int LAUNCH_ACTIVITY = 100; public void handleMessage(Message msg) { if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); switch (msg.what) { case LAUNCH_ACTIVITY: { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); final ActivityClientRecord r = (ActivityClientRecord) msg.obj; r.packageInfo = getPackageInfoNoCheck( r.activityInfo.applicationInfo, r.compatInfo); // ★ 调用 handleLaunchActivity 方法处理该消息 handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } break; } // switch } // handleMessage } // private class H extends Handler private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { // ★ 此处创建了一个 Activity Activity a = performLaunchActivity(r, customIntent); } private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")"); ActivityInfo aInfo = r.activityInfo; ContextImpl appContext = createBaseContextForActivity(r); // ★ 声明 Activity Activity activity = null; try { java.lang.ClassLoader cl = appContext.getClassLoader(); // ★ 创建 Activity , 与创建 Application 类似 activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); } catch (Exception e) { } try { // ★ 这里是传入 Activity attach 方法中的 Application , 赋值给 Activity 中的 mApplication 成员 Application app = r.packageInfo.makeApplication(false, mInstrumentation); if (activity != null) { appContext.setOuterContext(activity); // ★ 此处调用了 Activity 的 attach 方法 , 给 Activity 中的 mApplication 成员赋值 activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window, r.configCallback); return activity; }
参考路径 : frameworks/base/core/java/android/app/ActivityThread.java