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