美文网首页我的android学习
Android-Application详解

Android-Application详解

作者: 阿博聊编程 | 来源:发表于2020-11-15 22:31 被阅读0次

    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

    <application
           android:name="MyApplication">
    </application>
    

    相关文章

      网友评论

        本文标题:Android-Application详解

        本文链接:https://www.haomeiwen.com/subject/trktiktx.html