Android上下文——两种上下文的对比 getApplicationContext()与Activity.this的浅认识
2015-11-15 23:08
423 查看
在Android application开发中,我们经常使用Context上下文对象,Context上下文对象是代表当前运行环境的组件的上下文,是一种环境的定义。
在Android中有两种方式表示上下文的对象
1. getApplicationContext()
2. Activity.this
通过阅读源码我们知道,Activity是继承自上下文Context的,所以说Activity是Context的子类。
根据JAVA继承的特点,子类继承父类会保持(持有)父类的特性,并且对父类进行拓展,也就是说Activity继承了Context后,Context有的功能与方法在Activity中一定有,但是子类Activity中拓展的功能父类中就没有了。
拿一个常见的例子来解释:
在Android中我们使用对话框时,创建对话框的时候需要使用Dialog中的Builder内部类来创建对话框的标题、图标、内容等。这时
这个构造方法传递的是一个上下文的对象,这里如果使用getApplicationContext()的话会报出
android.view.WindowManagerBadTokenException异常。
这个异常的意思是:由于Dialog是Activity的一部分,所以dialog是显示在Activity中的,Dialog是挂载在Activity中的,这里构造如果传递父类的上下文对象的话会导致显示的对话框不明确在哪里显示。所以Google规定,在构造对话框的时候应当传递当前或者依赖的Activity对象。作为Activity是可以挂载对话框的。
也就是传递一个Activity的对象即父类Context的子类对象。
关于getContext()这个API是一个模拟的获取上下文对象的API 用于测试和内容提供者,并不是真实的上下文对象。
在Android中有两种方式表示上下文的对象
1. getApplicationContext()
2. Activity.this
通过阅读源码我们知道,Activity是继承自上下文Context的,所以说Activity是Context的子类。
根据JAVA继承的特点,子类继承父类会保持(持有)父类的特性,并且对父类进行拓展,也就是说Activity继承了Context后,Context有的功能与方法在Activity中一定有,但是子类Activity中拓展的功能父类中就没有了。
拿一个常见的例子来解释:
在Android中我们使用对话框时,创建对话框的时候需要使用Dialog中的Builder内部类来创建对话框的标题、图标、内容等。这时
AlertDialog.Builder builder = new Builer();
这个构造方法传递的是一个上下文的对象,这里如果使用getApplicationContext()的话会报出
android.view.WindowManagerBadTokenException异常。
这个异常的意思是:由于Dialog是Activity的一部分,所以dialog是显示在Activity中的,Dialog是挂载在Activity中的,这里构造如果传递父类的上下文对象的话会导致显示的对话框不明确在哪里显示。所以Google规定,在构造对话框的时候应当传递当前或者依赖的Activity对象。作为Activity是可以挂载对话框的。
AlertDialog.Builder builder = new Builer(MainActivity.this);
也就是传递一个Activity的对象即父类Context的子类对象。
关于getContext()这个API是一个模拟的获取上下文对象的API 用于测试和内容提供者,并不是真实的上下文对象。
相关文章推荐
- Android问题集锦之四十六:改包名后出现Error type 3
- android-Ultra-Pull-To-Refresh 源码解析
- Swift中数组(Arrary)及成员方法介绍
- Android Studio的使用(十一)--每次打开时选择项目,而不是直接进入上次项目
- webView 清除缓存
- android中的style部分属性值介绍
- UnityEditor中建立两个Color,实现mesh的颜色渐变(Gradient)(GUI.changed,SceneView.RepaintAll())
- ios流媒体--播放,下载
- Android Studio的使用(六)
- android的四种定位方式
- Android中的常用的对话框
- 《第一行代码Android》学习日记14
- Swift(二十四、访问权限)
- iOS开发之集成百度语音
- Error parsing D:\sdkforas\android-sdk-windows\system-images\android-22\android-wear\x86\devices.xml
- iOS开发之图片操作,移动,旋转,缩放实例演示
- android studio使用中碰到Failure [INSTALL_FAILED_OLDER_SDK] 问题
- IOS KVO笔记
- Android 手机小闹钟
- PhoneGap创建的安卓WebApp项目如何去除全屏,显示手机顶部状态栏