Android开发 - Application 基础类全局的应用级状态管理解析

Application 是什么

  • Application 是一个基础类,用于全局应用级状态管理。它在应用程序启动时创建,并在应用程序关闭时销毁Application 对象的生命周期与应用程序的生命周期一致,因此它非常适合用来保存全局的应用状态信息初始化全局资源

Application 的主要作用

全局状态管理

  • Application 类可以用来存储全局的应用状态和数据。例如,可以在 Application 类保存一些在整个应用生命周期内都需要数据或对象

全局配置和初始化

  • 可以在 Application 类onCreate() 方法中进行一些全局的初始化操作,如设置第三方 SDK初始化全局变量配置日志工具

单例模式的替代

  • 由于 Application 对象全局唯一的,许多时候它可以替代单例模式,用来保存一些全局共享资源和对象

共享资源和数据

  • Application 类可以用来存储和管理一些需要在不同组件(如 Activity、Service)之间共享资源和数据

Application 类的使用示例

  • 自定义 Application 类:要使用 Application 类,首先需要创建一个自定义的 Application 类,并在其中重写 onCreate() 方法来进行初始化操作。然后,在 AndroidManifest.xml 文件声明这个自定义的 Application 类

    // 导入必要的包
    import android.app.Application; // 引入 Android 应用程序类的基本包
    
    // 自定义的 Application 类,继承自 Android 的 Application 基类
    public class MyApplication extends Application {
    
        // 定义一个全局的字符串变量,保存应用级别的数据
        // 这个变量是应用级别的全局数据,可以在整个应用程序的生命周期内访问和修改
        private String globalData;
    
        // 这是 Application 类的生命周期方法,在应用程序启动时调用一次
        @Override
        public void onCreate() {
            super.onCreate(); // 调用父类的 onCreate 方法,确保父类的初始化逻辑被执行
    
            // 在应用启动时进行初始化操作,可以在这里设置全局状态、初始化第三方库等
            // 可以在这个位置初始化任何需要在应用程序启动时初始化的全局配置或第三方库
            globalData = "应用启动时初始化的数据";
            // 例如,初始化第三方库
            // initSomeLibrary(); // 可以在这里调用初始化第三方库的方法。例如,如果你使用某个第三方分析库,可以在这里进行初始化
        }
    
        // 提供一个public(公共)方法来获取全局数据,其他组件(如 Activity 或 Service)可以通过调用这个方法返回当前的 globalData 值
        // 这个方法可以让应用程序的其他部分(例如,Activity 或 Service)访问 globalData
        public String getGlobalData() {
            return globalData;	// 返回 globalData 的当前值
        }
    
        // 提供一个public(公共)方法来设置 globalData 的值,其他组件可以通过调用这个方法来更新全局数据
        public void setGlobalData(String globalData) {
            this.globalData = globalData;	// 将传入的参数 globalData 赋值给类的成员变量 globalData。this 关键字用于区分成员变量和参数变量
        }
    }
    
  • 声明自定义的 Application 类:在 AndroidManifest.xml声明自定义的 Application 类

    <application
        android:name=".MyApplication"  <!-- 指定自定义的 Application 类 -->
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <!-- 其他配置 -->
    
    </application>
    

Application 类的常见用法

全局变量和数据存储

  • Application 类存储应用级别全局数据,以便在整个应用程序中访问和修改

    // 自定义的 Application 类
    public class MyApplication extends Application {
    
        // 定义一个私有的全局的字符串变量
        private String globalData;
    
        // 重写 onCreate() 方法,这个方法在应用启动时调用
        @Override
        public void onCreate() {
            super.onCreate(); // 调用父类的 onCreate 方法,确保父类初始化逻辑被执行
            globalData = "初始化数据"; // 设置全局数据的初始值
        }
    
        // 获取全局数据的方法
        public String getGlobalData() {
            return globalData;
        }
    
        // 设置全局数据的方法
        public void setGlobalData(String globalData) {
            this.globalData = globalData;
        }
    }
    

初始化第三方库

  • 在应用程序启动时初始化第三方库或 SDK,例如分析工具广告 SDK

    // 自定义的 Application 类
    public class MyApplication extends Application {
    
        // 重写 onCreate() 方法,应用启动时调用
        @Override
        public void onCreate() {
            super.onCreate(); // 调用父类的 onCreate 方法
    
            // 初始化第三方库
            initThirdPartyLibrary();
        }
    
        // 初始化第三方库的方法
        private void initThirdPartyLibrary() {
            // 示例代码:初始化第三方分析 SDK
            // AnalyticsLibrary.initialize(this);
            // 具体初始化代码取决于第三方库的要求
        }
    }
    

全局异常处理

  • 设置全局异常处理器,用于捕获未处理的异常避免应用崩溃收集错误日志

    // 自定义的 Application 类
    public class MyApplication extends Application {
    
        // 重写 onCreate() 方法,应用启动时调用
        @Override
        public void onCreate() {
            super.onCreate(); // 调用父类的 onCreate 方法
    
            // 设置全局未捕获异常处理器
            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                @Override
                public void uncaughtException(Thread thread, Throwable e) {
                    // 处理未捕获的异常
                    // 例如,记录日志、显示错误页面等
                    // Log.e("MyApplication", "Uncaught exception", e);
                }
            });
        }
    }
    

应用生命周期管理

  • 监控应用的前后台状态,进行相应的处理,例如统计应用的使用时间

    // 自定义的 Application 类
    public class MyApplication extends Application {
    
        // 声明一个私有布尔变量,表示应用是否在后台
        private boolean isAppInBackground = false;
    
        // 重写 onCreate() 方法,应用启动时调用
        @Override
        public void onCreate() {
            super.onCreate(); // 调用父类的 onCreate 方法
    
            // 注册 Activity 生命周期回调来检测应用的前后台状态, 监听活动的生命周期事件
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                
                // 实现 onActivityResumed 方法,应用从后台恢复到前台时调用
                @Override
                public void onActivityResumed(Activity activity) {
                    // 应用从后台恢复到前台: 设置应用状态为前台
                    isAppInBackground = false;
                }
    
                // 实现 onActivityPaused 方法,应用从前台进入后台时调用
                @Override
                public void onActivityPaused(Activity activity) {
                    // 应用从前台进入后台: 设置应用状态为后台
                    isAppInBackground = true;
                }
    
                // 其他生命周期方法可以忽略
    
                @Override
                public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
                @Override
                public void onActivityStarted(Activity activity) {}
                @Override
                public void onActivityStopped(Activity activity) {}
                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
            });
        }
    
        // 提供一个公共方法来获取应用是否在后台的状态
        public boolean isAppInBackground() {
            // 返回当前应用是否在后台的状态
            return isAppInBackground;
        }
    }
    

总结

  • Application入口类全局唯一整个应用生命周期内存在

  • 适合存储全局状态信息进行全局初始化管理共享资源

  • 通过自定义 Application 类,可以实现更复杂应用逻辑和全局管理

posted @ 2024-08-27 17:08  阿俊学JAVA  阅读(69)  评论(0编辑  收藏  举报