(Android基础)什么是Context

##概述:

一个Context就是一个场景,一个用户和应用程序交互的场景.

Activity类基于(继承)Context,Service也是基于Context.虽然Activity和Service都还实现其他的接口,但是从设计角度来看.
接口的实现只是对类功能的扩展.而继承才是类的本质,所以Activity/Service的本质是一个Context,其所实现的接口只是为了扩充
Context的功能.扩充之后称为Activity或Service
图片加载失败
Context的创建

  • Applicatiopn对应的Context

图片加载失败

首先AMS通过远程调用ActivityThread的bindApplication方法,然后根据远程通讯传递的数据(一是ApplicationInfo,一是其他数据)构造出
AppBindData,使用ApplicationInfo创建出LoadedApk保存下来,并给AppBindData的info赋值,
之后在makeApplication中使用LoadApk创建ApplicationContext

构造时参数为 ActivityThread LoadedApk
图片加载失败

  • Activity对应的Context

首先AMS通过远程调用ActivityThread的scheduleLaunchActivity方法,然后根据远程通讯传递的数据(一是ActivityInfo,一是其他数据)构造出
ActivityClientRecord,并持有之前创建的LoadApk,之后执行performLaunchActivity,在createBaseActivityForActivity中为Activity创建Context

构造时参数为 ActivityThread LoadedApk IBinder(activityinfo)

图片加载失败

  • ServiceInfo
    *

启动Service,首先AMS会远程调用ActivityThread的scheduleCreateService,然后根据远程通讯传递的数据(一是ServiceInfo一是其他数据)构造出
CreateServiceData,之后调用handleCreateService,在handleCreateService中创建Context,方法和创建Application中的一致
图片加载失败

总体来说一个应用包含多个Context的实现类ContextImpl,但是他们内部的LoadApk是相同的,也就是说对于程序来说ContextImpl是轻量级的存在,二LoadAPk才是重量级,
从代码中也可以发现在ContextImpl中不少API的实现都依赖LoadApk

除了以上三种ContextImpl系统中还存在一种即是SystemContext,
图片加载失败
图片加载失败

您的一份奖励,就是我的一份激励