全局对象Application的使用
2017-03-30 20:35
295 查看
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。打开每一个应用程序的manifest文件,可以看到activity都是包含在application标签之中,如下:
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用Application。
为了更好的利用Application的这一特性,比如我们需要Application来保存一些静态值,需要自定义继承于Application的类,然后在这个类中定义一个变量来保存。在默认情况下应用系统会自动生成Application 对象,但是如果我们自定义了Application,那就需要告知系统,实例化的时候,是实例化我们自定义的,而非默认的。比如我们自定义了一个AppContext类:
为了让系统实例化的时候找到,我们必须在manifest中修改application标签属性:
关键的是这句:android:name=”.AppContext”
通常Application全局对象是通过Context或者Activity的getApplicationContext()方法获得的比如我们在应用程序中想要获得我们刚刚定义的AppContext对象,就需要在activity中这样做:
如果有Context对象,还可以:
但是很多时候我们的代码可能在activity之外,且没有context对象的引用,但是又需要获得AppContext对象,原始的做法可能是想办法将activity或者context传递到需要调用的地方,但是这样代码耦合度太高,可读性差。我们有更优雅的做法。
我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没有,我们只能在自定义的时候想办法。
Application是系统的一个组件,也就有自己的生命周期函数,让人感到意外的是他的生命周期函数中居然也有onCreate(),onCreate是被自动调用的,我们可以利用这点来获得这个Application对象。
在AppContext中加入如下几行代码:
这样我们就能在app工程的任何地方通过AppContext.getInstance()来获得Application全局对象。比如我定义了一个工具类,在工具内中我们需要使用
Context的getExternalFilesDir()方法。但是这个工具类没有直接的办法获取到context,于是我们可以:
ab7f
<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);
ab7f
相关文章推荐
- 全局对象Application的使用,以及如何在任何地方得到Application全局对象
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- ASP.NET基础教程-服务器全局会话Application对象的使用
- Android application对象的使用 全局变量
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- spring架构,创建一个全局使用的application对象
- 全局对象Application的使用,以及如何在任何地方得到Application全局对象
- Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
- Android application对象的使用 全局变量
- 使用Application、Session、Cookie、ViewState等对象
- 使用APPlication,Session,Cookie和ViewState等对象保存信息的区别是什么?
- VC6.0上编译的程序使用不调用全局对象的析构函数
- Stream、WshShell、WshUrlShortcut对象及Shell.Application的参数与使用
- 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- 三种状态对象的使用及区别(Application,Session,Cookie)
- 技巧:使用可扩展对象模式扩展HttpApplication
- 【使用Excel.Application对象打开的xls文件】与【手动打开的xls文件】在关闭时相互干扰的解决办法
- Android笔记 Application对象的使用-数据传递以及内存泄漏问题
- 在ASP.NET中使用Session与Application 对象(续)