在Android开发中怎样使用Application类
转载地址:http://www.jianshu.com/p/3138f9c351e8
--- 在Android开发中怎样使用Application类
自己独立开发项目才发现以前对Application类并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。
1. Context类型
Android是用Java语言来编写和,然而Android却需要一个完整的Android工程环境,在这个环境下,我们熟悉的Activity、Service、ContentPrivoder等系统组件才能有自己各自的上下文环境,也就是Context。Context是维持Android应用的核心功能类,是整个Android系统交互的核心。
Context的继承结构从图中可以看到,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类,ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。
在这里我们至少看到了几个所比较熟悉的面孔,Activity、Service、还有Application。由此,其实我们就已经可以得出结论了,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
一种比较特殊的情况是Dialog要求在Activity的Context中弹出,而一些全局的例如网络终端的Dialog需要什么特殊权限。
2. Application类在项目开发中的使用
首先在项目目录下一个Java类继承Application类,实现是onCreate()方法。这个类可以做APP的全局初始化工作,比如图片加载框架的全局配置信息设置。
public class AndroidApplication extends Application {private static AndroidApplication instance;@Overridepublic void onCreate() {super.onCreate();instance = this;}public static AndroidApplication getInstance(){return instance;}
}
然后千万不要忘了在Android项目的Manifest文件中指定Application的实现类,不然系统会创建一个默认的Application类。
<applicationandroid:name=".AndroidApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application>
3. Application类或Context类的误用情况
1. 不能用Application缓存数据!!!
因为Application会因为进入background后内存不足被系统干掉,进入后系统会重现创建一个Application类,而导致缓存在Application类里的数据全部初始化而丢失。
2. 错误的获取全局Context对象的方式
public class AnddroidApplication extends Application { private static AnddroidApplication app; public static AnddroidApplication getInstance() {if (app == null) { app = new AnddroidApplication(); } return app; } }
上面这种方式如果是单纯的Java工程可能没有问题,但是在Android里这样说大错特错的。因为Application是系统组件,系统组件实例是要由系统去创建的,如果我们这里直接创建一个,不过是简单的Java对象而已,不具备任何Context能力,也无法进行任何Context操作。标准的写法就本文的第一段示意代码那样。
3. 在控件的构造方法中获取Context或者做其他视图操作
写过Android的同学应该知道自己或者看别人dome都很少或者基本看不到在控件构造函数内进行初始化,获取参数等这些操作吧!是的,这样做是很容易出难以发现的Bug的。具体原因是在ContextWrapper类的源码中,他有一个attachBaseContext()方法,这个方法会将传入的一个Context参数赋值给mBase对象,之后mBase对象就有值了。而我们又知道,所有Context的方法都是调用这个mBase对象的同名方法,那么也就是说如果在mBase对象还没赋值的情况下就去调用Context中的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况。Application中方法的执行顺序如下图所示:
作者:蝉翅的空响
链接:http://www.jianshu.com/p/3138f9c351e8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在Android开发中怎样使用Application类相关推荐
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
Android开发中遇到的问题(四)--Android中WARNING: Application does not specify an API level requirement!的解决方法 参考文 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
在android开发中使用multdex的方法-IT蓝豹为你整理 Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个, ...
- android开发中遇到的问题汇总
android开发中遇到的问题汇总(五),android汇总127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html1 ...
- Android开发中内存、内部存储、外部存储详解
手机是有两个内存的.2G和16G同时出现在一个手机中,2G是指运行内存,16G是指存储内存. 手机的内存,分两种,一个是存储内存,相当于电脑的硬盘,一般手机参数里超过4G的都是指这个.存储内存是可以扩 ...
- 浅谈Android开发中的NFC功能
目录 1."NFC"的自我描述 1.1 NFC功能的基本概念 1.2 NFC功能的背景.特性及发展趋势 2.NFC的基础知识.基本原理 2.1 NFC的工作模式 2.2 实现NFC ...
- dagger android,在Android开发中使用Dagger2的方法
在Android开发中使用Dagger2的方法 发布时间:2020-12-08 17:12:38 来源:亿速云 阅读:236 作者:Leah 在Android开发中使用Dagger2的方法?相信很多没 ...
- Android开发中应避免的重大错误
by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...
- 史上最全Android开发中100%会用到的开源框架整理(1/5)
其实这个开源框架整理很久了,只是一直放在有道云笔记里面,笔者还有很多写得文章都放在有道云笔记里面,有时间都好好整理一下放出来,本篇文章也会不定期更新,由于整理的开源框架分类都有200多个,所有这次只将 ...
- Android开发中使用七牛云存储进行图片上传下载
Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...
最新文章
- BZOJ 4244 邮戳拉力赛 (DP)
- TIMESTAMP 与 explicit_defaults_for_timestamp
- .NET 进程和线程
- 如何在移动硬盘上安装Linux
- uva 11491——Erasing and Winning
- pip3 安装pycrypto 时报错
- java中static类的作用是什么意思_java中static关键字是什么意思
- ASP.NET大闲话:ashx文件有啥用
- mongodb分页优化
- wpf基于DevExpress实现折线图的两种方法
- python机器学习之特征选择(过滤法、嵌入法、包装法案例详解)
- [日推荐]『小恩故事』育儿助手!
- 手机cpu天梯图2020
- 百度地图高级实例2-如何利用自己的数据制作社交地图?只显示可视区域内的标注
- Halcon 学习笔记八:颜色识别
- linux注销系统有几种方法,怎么注销Linux子系统
- ld-linux-x86-64.so.2挖矿木马,排查操作记录
- java题算工资,AcWing 3238. 工资计算java
- Django配置163邮箱出现 authentication failed(535)错误解决方法
- 黑猴子的家:Scala Case语句的中置(缀)表达式