Android笔记 之 搞清楚 Application 应用

来源:互联网 发布:淘宝手提包品牌 编辑:程序博客网 时间:2024/05/17 23:22
  1、素未谋面——什么是application ?
首先,它同 Service 一样是 Android 架构里的一个系统组件。通常,当我们自己新建一个项目的时候,系统会自动给我们创建一个 application 对象,存储着系统的一些信息。 但是, 这只是默认的 application , 如果你想得到更好的应用的话, 就得自己来写了。
      这时候,我们就可以新建一个类文件,继承 Application , 并且要在 Manifest 中注册,就在 Application 标签里增加一个name 属性即可。
      android:name="com.lin.BaseApplication"
     这还不够,其实,我认为,application 最深刻的意义在于它是唯一至关重要的,很明显,application 翻译成中文就是“应用”,至此,意思不言而喻了。
好了,一句话讲晒—— Application 就是一个Android 应用的命!!

2、不明觉厉——你到底能干啥?
如果我们不自己去创建Application , 那么系统就会给我们创建。无论谁来创建,每个程序都只会有一个 Application 类的对象,就好比与一个人一辈子就只能有一个伴侣一样,如果我们不自己去争取自由的婚姻爱情(创建并建立起自己的 Application) , 那么系统给我们安排的,就如同于媒妁之言,父母之命一样,注定了的。 application 对象的生命周期就是我们所开发的这个应用程序的声明周期。正因为它是全局的唯一对象,所以在不同的 Activity 、Service 中所获取的对象都是同一个对象,那么借此机会,我们就可以进行数据传递、数据共享和数据缓存等操作了。 所以,如果我们自己定义一个 Application , 那么它存在的意义就在于 放一些全局的和一些上下文都要用到变量和方法之类的。
好了,一句话讲晒——Application 里可以放全局变量和方法,传递数据!!

3、华山论剑——与其他传递数据方式的比较
 我们知道,在Android 中传递数据的方法比较常用就有四种。
(1)通过Intent (Bundle) 传递数据;
(2)通过 static 静态变量传递数据;
(3)通过Clipboard剪贴板传递数据;
(4)通过全局变量来传递数据。
显然,第四种就是我们今天要说的 Application 的主要作用所在。
如果你开发过 Java Web ,就肯定知道 Java Web 的4个作用域: Page , Request , Session 和 Application 。 其中Application 域内的东西就可以在应用程序的任何地方被访问,只要Web服务器一直在运行。Android 中的Applicaiton里面存放的全局变量就是这样的, 只有停止该应用程序,全局对象才会死亡,否则将一直活着。
    好,下面我们来看下如何使用 Application 定义全局变量,然后被其他对象所使用。 

第一步: 新建一个类,继承Application , 并声明对象。
由于平常中我们经常需要用到实时定位的信息,这其中就是需要调用百度地图所开放的API 接口获取GPS定位数据的。因此,在这里,定义三个全局变量。
public class BaseApplication extends Application { public String mLocation;   //位置信息 public double mLongitude; //经度 public double mLatitude;   //纬度

第二步,在Manifest 中注册
  <application        android:icon="@drawable/icon"        android:label="@string/app_name"        android:name="com.lin.BaseApplication"        android:theme="@android:style/Theme.NoTitleBar" >        <activity          ...

第三步,获取全局变量,然后对其进行读或者写
通过 Activity.getApplicationContext() 可以在程序的任何位置 获取全局变量,比如说我在某一个Activity 中想用到全局变量经纬度信息,那么代码如下:
private BaseApplication mApplication; mApplication = (BaseApplication) getApplicationContext();  // 其实用getApplication();  也是可以的private String mLocationInfo = "" ;       mLocationInfo =mApplication.mLocation; //获取位置信息

写也是一样,直接写就行。
mApplication.mLatitude = 40.121212;

比较:
(1)通过Intent (Bundle) 传递数据;
虽然这是最常用的方式,但是它的局限性就是 不能传递不能序列化的对象,比如说我一个存储了图像数据的 Bitmap 对象,你就没辙了吧。
(2)通过 static 静态变量传递数据;
诚然,静态变量就可以很好地解决了 Intent 所不能解决的问题,比如直接用一个静态的 ArrayList<Object>来存储Bitmap 对象就好了。
问题是,如果我有很多的Bitmap 对象,这东西很占资源,如果你都用静态变量来存储和传递的话, 呵呵,可能会导致内存溢出哦。而且,因为很多地方都可能会用到并且修改静态变量,你维护起来就比较麻烦了。
(3)通过Clipboard剪贴板传递数据;
剪贴板,顾名思义,就是我把一些数据复制到内存里的某一个区域,然后呢,你或他都可以从这一区域中获得数据,然而,剪贴板只能简单类型和可序列号化的对象,和 Intent 一样,

Application 全局变量的优势: 
以下内容出自于 http://blog.csdn.net/lieren666/article/details/7598288  

我一般会习惯在application中建立两个HashMap<String,Object>一个用于数据的传递,一个用于缓 存一些数据。比如有一个Activity需要从网站获取一些数据,获取完之后我们就可以把这个数据cache到Application 当中,当页面设置到其它Activity再回来的时候,就可以直接使用缓存好的数据了。但如果需要cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地rom上或者sd卡上。如果在application中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网 络上获取。

当然,如果使用Application保存了一些不该保存的对象,比如说视频文件,高达几M的图片,也是很容易导致内存泄漏,所以比较大的对象还是存到SD卡里去,然后把他们的保存路径存放在数据库或者 Application 里来传递还是可以的。
所以,一句话讲晒—— Application 缓存传递数据,我有我独特的风景!











0 0
原创粉丝点击