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

 <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类:

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标签属性:

<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中加入如下几行代码:

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,于是我们可以:

return AppContext.getInstance().getExternalFilesDir(null);

原文:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0924/1558.html

最新文章

  1. mac 端口转发方案
  2. 大话redis/memcache缓存
  3. windows命令行编码与nodejs编码格式冲突的解决方式
  4. kafka消息中间件及java示例
  5. 2.Java集合总结系列:List接口及其实现
  6. 敏捷开发之产品日日新,一步通之---自动化代码构建-&gt;自动化打包-&gt;自动化安装部署
  7. linux环境下安装nginx步骤
  8. 【一天一道LeetCode】#226. Invert Binary Tree
  9. -1-0 Java 简介 java是什么 java简单介绍
  10. 学号 20175223 《Java程序设计》第9周学习总结
  11. win10下安装ubantu
  12. windows下SVN服务器搭建--VisualSVN与TortoiseSVN的配置安装
  13. FFT笔记
  14. js的Timer方法
  15. requestNextAnimationFrame兼容主浏览器方法
  16. 【Hadoop UI学习】Hue
  17. git学习总结 - 纯命令
  18. swagger注释@API详细说明
  19. mysql高级聚合
  20. 初识Android的ReactiveX

热门文章

  1. hibernate连接oracle数据库
  2. HDU 5881--Tea 思维规律
  3. 动态规划&amp;字符串:最长公共子串
  4. 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]
  5. [Leetcode Week2]Sort List
  6. linux驱动基础系列--Linux I2c驱动分析
  7. linux system函数分析
  8. js判断对象为空
  9. 【python】正则表达式相关
  10. TCP,UDP,IP包头格式及说明(zz)