Android Application 的理解和使用
1.API
extends ContextWrapper
implements ComponentCallbacks2
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Application
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.
2.理解
Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。
Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。
一般情况下我们是不需要指定一个Application的,系统会自动创建,但当我们在做比较大的项目时,可能需要使用第三方库(比如友盟啊,融云啊 blabla的),第三方库要求在Application 类中实例化或注册一些对象,这时候需要自己自定义一个Application类,这只需要创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(给application标签增加name属性,并添加自己的 Application的名字)即可。
启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。
3.举例
public class MyApplication extends Application{
private String value;
@override
public void onCreate() {
super().onCreate();
//do something
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
这样,在整个程序中都可以对value进行操作。这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。
注意在AndroidManifest.xml 文件中配置MyApplication
<application
android:name = ".MyApplication"><!-- 注意MyApplication的文件路径,不过一般IDE会给提示-->
</application>
使用时只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,然后再得到相应的成员变量即可。它是代表应用程序的类,使用它可以获得当前应用的主题和资源文件中的内容等,这个类更灵活的一个特性就是可以被继承,来添加自己的全局属性。