7.理解Context

Context类本身是一个纯abstract类.为了使用方便,又定义了ContextWrapper类,如其名所言,这只是一个包装而已,ContextWrapper构造函数中必须包含一个真正的Context引用,同时ContextWrapper中提供了attachBaseContext()用于给ContextWrapper对象中指定真正的Context对象,调用ContextWrapper的方法都会被转向其所包含的真正的Context对象.ContextThemeWrapper类,如其名称所示,其内部包含了与主题theme相关的接口,这里所说的主题就是在manifest中通过android:theme为Application元素或者Activity元素指定的主题.只有Activity才需要主题,Service是不需要主题的,所以Service直接继承于ContextWrapper.ContextImpl类真正实现了Context中所有的函数,应用程序中所调用的各种Context类的方法,其实现均来自该类.

创建Context对象是在ActivityThread类中完成的,具体创建ContextImpl类的地方一共有7处,分别如下:

  • PackageInfo.makeApplication()
  • performLaunchActivity()
  • handleCreateBackupAgent()
  • handleCreateService()
  • handleBindApplication()
  • 还是在handleBindApplication()中
  • attach()

system_server进程本身也是一个应用程序,所以其入口也是ActivityThread类,只是这个ActivityThread和一些系统服务运行在同一个进程空间中而已.

Application对应Context,Android Unit Test工程会创建ContextImpl对象,makeApplication()方法中会创建ContextImpl.

Activity对应的Context,ActivityThread内部会为每一个Activity创建一个ActivityRecord对象,并使用这些数据对象来管理Activity.接着会调用到handleLaunchActivity()然后再调用到performLaunchActivity()在该方法中创建ContextImpl.

Service对应的Context,ActivityThread的scheduleCreateService()方法中会构造一个CreateServiceData的数据对象,ActivityThread会为其所包含的每一个Service创建该数据对象,并通过这些对象来管理Service.接着会执行handleCreateService()方法,创建ContextImpl.

类名 远程数据类 本地数据类 赋值方式
Application ApplicationInfo AppBindData getPackageInfoNoCheck()
Activity ActivityInfo ActivityRecord getPackageInfo()
Service ServiceInfo CreateServiceData getPackageInfoNoCheck()

Context个数=Service个数+Activity个数+Application

results matching ""

    No results matching ""