Android-Application详解

Application类在每一次开发当中是我们都会遇到的,每一个APP都会有一个Application实例,它拥有和APP一样长的生命周期,Application和APP一起“同生共死”,下面是我对Application的理解阐述。

Application类

Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个 Application对象,用来存储系统的一些信息。

Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。

通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。

启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。

Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。

Application类的方法

onCreate()方法

在Application创建的时候调用,一般用于初始化一些东西,如全局的对象,环境的配置等。

onConfigurationChanged(Configuration newConfig)方法

重写此方法可以监听APP一些配置信息的改变事件(如屏幕旋转等),当配置信息改变的时候会调用这个方法。在Manifest文件下的Activity标签(注意是Activity)里配置android:configChanges属性相应的配置属性,会使Activity在配置改变时候不会重启,只会执行onConfigurationChanged()方法。如:android:configChanges="keyboardHidden|orientation|screenSize"属性可以使Activity旋转时不重启。

onLowMemory()方法

重写此方法可以监听Android系统整体内存较低时候的事件。按我的理解就是,当APP处于前台时,但是所有后台程序都被kill光了,但是还是内存不足时,系统就会调用这个方法告诉APP,兄弟轮到你了。我们可以在这个方法里面释放一些不重要的资源,来保证到时候内存足够而让APP进程不被系统杀掉,或者提醒用户清一下垃圾,让内存清一点空位出来,我的手机老是这样提示我,不知道是不是这个方法惹的祸。

onTerminate()方法

这个方法在程序结束的时候会调用。但是这个方法只用于Android仿真机测试的时候,在Android产品机是不会调用的。所以这个方法并没什么用。

r egisterActivityLifecycleCallbacks()和unregisterActivityLifecycleCallbacks()

这两个方法用于注册或者注销对APP内所有Activity的生命周期监听,当APP内Activity的生命周期发生变化的时候就会调用ActivityLifecycleCallbacks里面的方法:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.e(TAG,"onActivityCreated: " + activity.getLocalClassName());
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.e(TAG,"onActivityStarted: " + activity.getLocalClassName());
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.e(TAG,"onActivityResumed: " + activity.getLocalClassName());
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.e(TAG,"onActivityPaused: " + activity.getLocalClassName());
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.e(TAG, "onActivityStopped: " + activity.getLocalClassName());
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.e(TAG,"onActivityDestroyed: " + activity.getLocalClassName());
            }
        });

我们可以测试一下,把APP切换到后台再打开,查看log打印的情况如下:

onActivityPaused: MainActivity
onActivityStopped: MainActivity
onActivityStarted: MainActivity
onActivityResumed: MainActivity

registerComponentCallbacks()和unregisterComponentCallbacks()方法

用于注册和注销ComponentCallbacks2回调接口,里面的方法看名字就知道了:

 registerComponentCallbacks(new ComponentCallbacks2() {
            @Override
            public void onTrimMemory(int level) {

            }

            @Override
            public void onConfigurationChanged(Configuration newConfig) {

            }

            @Override
            public void onLowMemory() {

            }
        });

Context类也有这两个方法,但是Context类的方法只可以使用ComponentCallbacks,比Application少了一个onTrimMemory()回调。

Application的应用场景

在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被Destory掉之后才会被释放掉。

Application的自定义实现

1、继承Application

public class MyApplication extends Application{
   /**声明变量*/
    private String value;
   
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化全局变量
        setValue(VALUE); 
    }
   
    public void setValue(String value){
        this.value = value;
    }
   
    public String getValue(){
        return value;
    }
}

注意:继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。

2、在ApplicationManifest.xml文件中配置自定义的Application



你可能感兴趣的:(Android-Application详解)