转载地址:http://www.jianshu.com/p/3138f9c351e8
--- 在Android开发中怎样使用Application类

自己独立开发项目才发现以前对Application类并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。

1. Context类型

Android是用Java语言来编写和,然而Android却需要一个完整的Android工程环境,在这个环境下,我们熟悉的Activity、Service、ContentPrivoder等系统组件才能有自己各自的上下文环境,也就是Context。Context是维持Android应用的核心功能类,是整个Android系统交互的核心。

context继承图

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中方法的执行顺序如下图所示:

Application方法执行顺序

作者:蝉翅的空响
链接:http://www.jianshu.com/p/3138f9c351e8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在Android开发中怎样使用Application类相关推荐

  1. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法

    Android开发中遇到的问题(四)--Android中WARNING: Application does not specify an API level requirement!的解决方法 参考文 ...

  2. 在android开发中使用multdex的方法-IT蓝豹为你整理

    在android开发中使用multdex的方法-IT蓝豹为你整理 Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个, ...

  3. android开发中遇到的问题汇总

    android开发中遇到的问题汇总(五),android汇总127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html1 ...

  4. Android开发中内存、内部存储、外部存储详解

    手机是有两个内存的.2G和16G同时出现在一个手机中,2G是指运行内存,16G是指存储内存. 手机的内存,分两种,一个是存储内存,相当于电脑的硬盘,一般手机参数里超过4G的都是指这个.存储内存是可以扩 ...

  5. 浅谈Android开发中的NFC功能

    目录 1."NFC"的自我描述 1.1 NFC功能的基本概念 1.2 NFC功能的背景.特性及发展趋势 2.NFC的基础知识.基本原理 2.1 NFC的工作模式 2.2 实现NFC ...

  6. dagger android,在Android开发中使用Dagger2的方法

    在Android开发中使用Dagger2的方法 发布时间:2020-12-08 17:12:38 来源:亿速云 阅读:236 作者:Leah 在Android开发中使用Dagger2的方法?相信很多没 ...

  7. Android开发中应避免的重大错误

    by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...

  8. 史上最全Android开发中100%会用到的开源框架整理(1/5)

    其实这个开源框架整理很久了,只是一直放在有道云笔记里面,笔者还有很多写得文章都放在有道云笔记里面,有时间都好好整理一下放出来,本篇文章也会不定期更新,由于整理的开源框架分类都有200多个,所有这次只将 ...

  9. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

最新文章

  1. BZOJ 4244 邮戳拉力赛 (DP)
  2. TIMESTAMP 与 explicit_defaults_for_timestamp
  3. .NET 进程和线程
  4. 如何在移动硬盘上安装Linux
  5. uva 11491——Erasing and Winning
  6. pip3 安装pycrypto 时报错
  7. java中static类的作用是什么意思_java中static关键字是什么意思
  8. ASP.NET大闲话:ashx文件有啥用
  9. mongodb分页优化
  10. wpf基于DevExpress实现折线图的两种方法
  11. python机器学习之特征选择(过滤法、嵌入法、包装法案例详解)
  12. [日推荐]『小恩故事』育儿助手!
  13. 手机cpu天梯图2020
  14. 百度地图高级实例2-如何利用自己的数据制作社交地图?只显示可视区域内的标注
  15. Halcon 学习笔记八:颜色识别
  16. linux注销系统有几种方法,怎么注销Linux子系统
  17. ld-linux-x86-64.so.2挖矿木马,排查操作记录
  18. java题算工资,AcWing 3238. 工资计算java
  19. Django配置163邮箱出现 authentication failed(535)错误解决方法
  20. 黑猴子的家:Scala Case语句的中置(缀)表达式

热门文章

  1. 解决谷歌浏览器所有页面崩溃问题
  2. Nodejs学习笔记(七)——接口API
  3. 亚信java在线测评题库_校招秋招,网申在线测评如何训练才能通过?
  4. Hyperledger Fabric 实战(七):链码 shim API 详解
  5. Linux sed命令实例详解
  6. SQL Serve 查询所有可用的数据库语句
  7. C#中怎么判断一个数组中是否存在某个数组值
  8. android_今天的收获
  9. IDC分析报告:亚洲安全软件市场兴旺
  10. 美将遣返庇护申请者至墨西哥 弱势人士有望豁免