Android Context相关内容学习
概述
Android程序和Java程序一个不同的地方在于Android程序不能仅仅通过一个main方法就启动起来,他还需要特定的环境,就是Context,称之为上下文环境,在这个环境下,有Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的Context。Context是维持Android程序中各组件能够正常工作的一个核心功能类。
Context的继承结构还是稍微有点复杂的,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。ContextWrapper有三个直接的子类ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。由此,其实得出结论,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
Context数量 = Activity数量 + Service数量 + 1。上面的1代表着Application的数量,因为一个应用程序中可以有多个Activity和多个Service,但是只能有一个Application。
Application Context
很多的Application都是被当作通用工具类来使用的,只需要调用getApplication()方法就能拿到我们自定义的Application的实例。除了getApplication()方法,其实还有一个getApplicationContext()方法。
MyApplication myApp = (MyApplication) getApplication();
Context appContext = getApplicationContext();
getApplication()方法的语义性非常强,一看就知道是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法了,
MyApplication myApp = (MyApplication) context.getApplicationContext();