一、先看看文档里怎么说
Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml
's <application>
tag, which will cause that class to be instantiated for you when the process for your application/package
is created.
Application
类是用来维护应用程序全局状态。你可以提供自己的实现,并在 AndroidManifest.xml
文件的 <application>
标签中指出他的名字,这将导致在创建应用程序时去实例化你自己的 Application
类。
Android系统会为每个程序运行时创建一个Application
类的对象且仅创建一个,所以Application
可以说是单例 (Singleton)模式的一个类。且 Application
对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局唯一的,所以在不同的Activity,Service
中获得的对象都是同一个对象。所以通过 Application
来进行一些:数据传递、数据共享、数据缓存等操作。
二、重写 Application
类的生命周期事件
public void onCreate()
在应用程序创建的时候被调用,可以实现这个这个方法来创建和实例化任何应用程序状态变量或共享资源。还可以在这个方法里面得到 Application 的单例。
public void onTerminate ()
当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的onTerminate
方法而直接终止进程。
public void onLowMemory()
当系统资源匮乏的时候,我们可以在这里可以释放额外的内存, 这个方法一般只会在后台进程已经结束,但前台应用程序还是缺少内存时调用。可以重写这个方法来清空缓存或者释放不必要的资源。
public void onTrimMemory(int level)
当运行时决定当前应用程序应该减少其内存开销时(通常在进入后台运行的时候)调用,包含一个 level 参数,用于提供请求的上下文。
public void onConfigurationChanged (Configuration newConfig)
与 Activity
不同,配置改变时,应用程序对象不会被终止和重启。如果应用程序使用的值依赖于特定的配置,则重写这个方法来加载这些值,或者在应用程序级处理配置值的改变。
三、通过 Application
传递数据
假如有一个Activity
A, 跳转到 Activity
B ,并需要传递一些数据,通常的作法是 Intent.putExtra()
让Intent
携带,或者有一个Bundle
把信息加入Bundle
让Intent
传递Bundle
对象,实现传递。但这样有一个问题在于,Intent
和 Bundle
所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable
或者 Parcellable
接口。这其实是Android
的一种IPC
数据传递的方法。如果我们的两个Activity
在同一个进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
基本思路是:在 Application
中创建一个 HashMap
,以字符串为key
,Object
为value
这样我们的 HashMap
就可以存储任何类型的对象了。在Activity
A中把需要传递的对象放入这个HashMap
,然后通过 Intent
或者其它途径再把这 key 传递给Activity
B ,Activity
B 就可以根据这个字符串在 HashMap
中取出这个对象了。只要再向下转型 ,就实现了对象的传递。
四、Application
数据缓存
我一般会习惯在 Application
中建立两个 HashMap
一个用于数据的传递(见三),一个用于缓存一些数据。比如有一个Activity
需要从网站获取一些数据,获取完之后我们就可以把这个数据先存到Application
当中,当页面跳转到其它 Activity
再回来的时候,就可以直接使用缓存好的数据了。但如果需要cache
一些大量的数据,最好是cache
一些 (软引用)SoftReference
,并把这些数据cache
到本地Rom
上或者 SDCard
上。如果在 Application
中的缓存不存在,从本地缓存查找,如果本地缓存的数据也不存在再从网络上获取。