Context类图
类间关系:https://weichao.blog.csdn.net/article/details/129969122
Context是一个抽象类,定义了接口,它的实现类是ContextImpl类。
ContextWrapper是Context的派生类,它实现了Context类的接口。但是ContextWrapper类所有方法的实现只是转调其成员变量mBase的方法。mBase本身也是Context对象,其类型是ContextImpl,因此,ContextImpl类才是Context类真正的实现。这种设计模式称为代理模式或包装者模式。这种设计模式的好处是把接口和实现分离,可以动态地切换多种实现。
ContextImpl类是Context的真正实现类,它集成了应用框架的一些核心对象,如ActivityThread对象。
Activity,Service,Application都是从ContextWrapper类派生出来的。Activity是通过ContextThemeWrapper类间接派生的,这样实现的目的是为了实现Activity中单独的Theme。一个应用中可以有一套全局的Theme,同时每个Activity还可以有自己的Theme。ContextWrapper类的成员变量中保存Theme资源和Resource资源。这样它的派生类Activity就能有独立的Theme。
区别:
在安卓开发中,Application Context、Server Context和Activity Context都是Context类的子类,但是它们之间有一些区别。
-
Application Context:
是整个应用程序的上下文,它的生命周期与应用程序的生命周期相同。它可以访问应用程序的资源和类,如Resources和AssetManager,并且可以启动新的Activity、Service、发送广播消息等。它的作用范围是整个应用程序,因此它不会受到Activity的生命周期的影响。 -
Server Context:是Service的上下文,它的生命周期与Service的生命周期相同。它可以访问应用程序的资源和类,如Resources和AssetManager,并且可以启动新的Activity、Service、发送广播消息等。它的作用范围是整Service,因此它不会受到Activity的生命周期的影响。
-
Activity Context:
是Activity的上下文,它的生命周期与Activity的生命周期相同。它可以访问应用程序的资源和类,如Resources和AssetManager,并且可以启动新的Activity、Service、发送广播消息等。它的作用范围是整个Activity,因此它会受到Activity的生命周期的影响。
扩展:
在Activity中使用 View.inflate(context,r.layout.xxx)方法时,如果使用Application Context,则获得的View将不会受到Activity的生命周期的影响,即使Activity已经被销毁,View仍然存在。而如果使用Activity Context,则获得的View将会受到Activity的生命周期的影响,即当Activity被销毁时,View也会被销毁。
总的来说,这三种上下文都可以访问应用程序的资源和类,如Resources和AssetManager,并且都可以启动新的Activity、Service、发送广播消息等。但是它们的作用范围不同,因此在使用时需要根据实际情况进行选择。