Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。打开每一个应用程序的manifest文件,可以看到activity都是包含在application标签之中,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <application
        android:label="ViewPagerIndicator Sample"
        android:icon="@drawable/icon">
        <activity
            android:name=".ListSamples"
            android:label="ViewPager Indicator">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
.......
......
......

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用Application。

为了更好的利用Application的这一特性,比如我们需要Application来保存一些静态值,需要自定义继承于Application的类,然后在这个类中定义一个变量来保存。在默认情况下应用系统会自动生成Application 对象,但是如果我们自定义了Application,那就需要告知系统,实例化的时候,是实例化我们自定义的,而非默认的。比如我们自定义了一个AppContext类:

1
2
3
4
5
6
7
8
public class AppContext extends Application {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    public static final int NETTYPE_WIFI = 0x01;
    public static final int NETTYPE_CMWAP = 0x02;
    public static final int NETTYPE_CMNET = 0x03;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    public static final int PAGE_SIZE = 20;//默认分页大小
    private static final int CACHE_TIME = 10*60000;//缓存失效时间

为了让系统实例化的时候找到,我们必须在manifest中修改application标签属性:

1
2
3
4
5
<application
    android:name=".AppContext"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

关键的是这句:android:name=".AppContext"

通常Application全局对象是通过Context或者Activity的getApplicationContext()方法获得的比如我们在应用程序中想要获得我们刚刚定义的AppContext对象,就需要在activity中这样做:

appContext = (AppContext)this.getApplicationContext();

如果有Context对象,还可以:appContext = (AppContext)mContext.getApplicationContext();

但是很多时候我们的代码可能在activity之外,且没有context对象的引用,但是又需要获得AppContext对象,原始的做法可能是想办法将activity或者context传递到需要调用的地方,但是这样代码耦合度太高,可读性差。我们有更优雅的做法。

我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没有,我们只能在自定义的时候想办法。

Application是系统的一个组件,也就有自己的生命周期函数,让人感到意外的是他的生命周期函数中居然也有onCreate(),onCreate是被自动调用的,我们可以利用这点来获得这个Application对象。

在AppContext中加入如下几行代码:

1
2
3
4
5
6
7
8
9
10
private static AppContext instance;
public static AppContext getInstance() {
    return instance;
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    instance = this;
}

这样我们就能在app工程的任何地方通过AppContext.getInstance()来获得Application全局对象。比如我定义了一个工具类,在工具内中我们需要使用

Context的getExternalFilesDir()方法。但是这个工具类没有直接的办法获取到context,于是我们可以:

1
return AppContext.getInstance().getExternalFilesDir(null);
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0924/1558.html

Android全局对象Application的使用,以及如何在任何地方得到Application全局对象相关推荐

  1. JSP内置对象:request、response、out、session、application等内置对象

    Java程序的功能主要是由Java包下的各个类在运行期所产生的对象所提供,并且应用这些对象组织构建程序所需的功能. 所谓JSP内置对象,是指在JSP网页环境之下,用户不需要声明而直接可以在JSP网页中 ...

  2. javaweb之jsp的内置九大对象(request,response,out,session,application,pageContext,page,config,exception)的说明应用

    四.jsp的九大内置对象 jsp内置对象是指在警示牌页面中不用声明就可以在脚本和表达式中直接使用的对象. **特点** 内置对象有Web容器自动加载,不需要实例化. 内置对象通过Web容器来管理和实现 ...

  3. android studio 弹出式对话框设置时间_如何设置当单击某个对象时运行指定的应用程序?...

    在放映幻灯片的过程中,有时会需要启动其他应用程序,比如计算器或记事本来做一些辅助性的工作.在PowerPoint 2010中能否通过单击某个对象来运行指定的应用程序? 1解决方案 为指定对象设置动作效 ...

  4. url参数 转java对象_如何让Spring MVC接收的参数可以转换为java对象

    展开全部 可以使用@RequestBody注解:@RequestMapping(value = "user/saveUser"", method = RequestMet ...

  5. R语言as.name函数(转化为命名的类别对象)和is.name函数(检验是否是命名的类别对象)实战

    R语言as.name函数(转化为命名的类别对象)和is.name函数(检验是否是命名的类别对象)实战 目录 R语言as.name函数(转化为命名的类别对象)和is.name函数(检验是否是命名的类别对 ...

  6. python中对象和变量的关系_浅析python中的类变量和对象变量

    刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['t ...

  7. 万物皆对象java_又一次认识java(一) ---- 万物皆对象

    假设你现实中没有对象.至少你在java世界里会有茫茫多的对象,听起来是不是非常激动呢? 对象,引用,类与现实世界 现实世界里有许很多多的生物,非生物,跑的跳的飞的,过去的如今的未来的,令人眼花缭乱.我 ...

  8. MySQL批量查询能返回集合吗_JDBC——查询多条记录,返回对应的对象的集合;查询一条记录,返回对应的对象...

    //查询多条记录,返回对应的对象的集合 public List getForList(Class clazz, String sql, Object...args){ List list = new ...

  9. string转成对象_详解Java I/O流(五),对象序列化

    对象序列化 什么是序列化和反序列化呢? 序列化就是将对象转成字节序列的过程,反序列化就是将字节序列重组成对象的过程. 在这里插入图片描述 为什么要有对象序列化机制 程序中的对象,其实是存在有内存中,当 ...

最新文章

  1. (LeetCode 153)Find Minimum in Rotated Sorted Array
  2. 【Java系列】从JVM角度解析Java核心类String的不可变特性
  3. AngularJS学习的一些网址
  4. 【转】Java:String、StringBuffer和StringBuilder的区别
  5. 如何基于MaxCompute快速打通数据仓库和数据湖的湖仓一体实践
  6. qt中event->globalPos()与pos()
  7. MATLAB学习笔记(十)
  8. Python序列基本操作(二)
  9. 安装好panel部署MySQL_实战三种方式部署 MySQL5.7
  10. 用Java打开一个网页
  11. 水稻细菌性条斑病的分割与严重程度估计方法
  12. 前端特效demo | 一起围观 10 种创意时钟
  13. linux服务器的又一管理利器webmin图解教程
  14. ORACLE认证考试之ocjp 考试题之五
  15. cnn app for android phones,Freedom Apk Download for Android Phones / Tablets Latest Version
  16. excel多工作表汇总如何完成?
  17. vue开发微信公众号调用相机和相册(上传到自己的服务器)
  18. Java字符串格式化详解
  19. windows10批量修改文件后缀名
  20. 【数学】第二型曲线积分

热门文章

  1. My cnblogs's first day
  2. Linux - chmod
  3. B. Quasi Binary
  4. ADO.NET 4.5中的异步与流特性
  5. Modelsim仿真流程
  6. C# 汉字转拼音(全拼)
  7. SpringBoot集成多数据源
  8. 多进程实现生产者消费者
  9. git 忽略文件不起作用
  10. P2184 贪婪大陆