diff --git a/blogs/Android/Framework/Interview/应用进程相关/Context 的理解.md b/blogs/Android/Framework/Interview/应用进程相关/Context 的理解.md new file mode 100644 index 0000000..79ac1b0 --- /dev/null +++ b/blogs/Android/Framework/Interview/应用进程相关/Context 的理解.md @@ -0,0 +1,84 @@ +--- +谈谈你对 Context 的理解? +--- + +1. 了解 Context 的作用 +2. 熟悉 Context 初始化流程 +3. 深入理解不同应用组件之间 Context 的区别 + +#### 问题 + +1. 应用里面有多少个 Context?不同的 Context 之间有什么区别? +2. Activity 里的 this 和 getBaseContext 有什么区别? +3. getApplication 和 getApplicationContext 有什么区别? +4. 应用组件的构造,onCreate、attachBaseContext 调用顺序? + + + +```java +class ContextImpl extends Context { + final ActivityThread mMainThread; + final LoadedApk mPackageInfo; + + private final ResourcesManager mResourcesManager; + private final Resource mResources; + + private Resources.Theme mTheme = null; + private PackageManager mPackageManager; + + final Object[] mServiceCache = SystemServiceRegistry.createServiceCache(); +} +``` + +#### Context 是在哪创建的? + +Application : + +1. 继承关系 + + Application <- ContextWrapper <- Context + +2. 调用顺序 + + \ -> attachBaseContext -> onCreate + +Activity: + +```java +private Activity performLaunchActivity() { + Activity activity = null; + activity = mInstrumentation.newActivity(); + + Application app = r.packageInfo.makeApplication(); + Context appContext = createBaseContextForActivity(r, activity); + activity.attach(appContext, app, ...); + + activity.onCreate(); + return activity; +} +``` + +1. 继承关系 + + Activity <- ContextThemeWrapper <- ContextWrapper + +2. 调用顺序 + + \ -> attachBaseContext -> onCreate + +Service: + +```java +private void handleCreateService(CreateServiceData data) { + Service service = null; + service = (Service) cl.loadClass(data.info.name).newInstance(); + + ContextImpl context = ContextImpl.createAppContext(this, packageInfo); + context.setOuterContext(service); + + Application app = packageInfo.makeApplication(); + service.attach(context, app); + service.onCreate(); +} +``` +