美文网首页Android开发经验谈Android开发Android技术知识
单例模式-全局可用的 context 对象,这一篇就够了

单例模式-全局可用的 context 对象,这一篇就够了

作者: 圆号本昊 | 来源:发表于2019-07-17 17:13 被阅读11次

    单例模式在各个方面都有着极为广泛的使用,所谓单例,顾名思义就是整个程序中只有一个该类的实例,所以它成功保证了整个程序的生命周期内该类的对象只能创建一次,并且提供全局唯一访问该类的方法:getInstance()


    使用

    关于单例模式主要分为两类:

    • 懒汉模式
    • 饿汉模式

    由于饿汉模式是线程安全的,所以通常情况下,我们都尽量采用饿汉模式,具体原因常见这位大佬的博文:点击前往

    本文主要结合 Android 分析下当例模式在 Android 中获得全局可用的 Context 对象


    搭建饿汉模式基本框架

    单例模式基本方法包括

    • 一个该类对象
    • 该类构造方法
    • 获得单例的方法
    /**单例模式
     *
     * 向整个应用提供 App (application) 单例
     */
    public class AppContext {
    
        private static AppContext instance;
    
        public AppContext(Context application){
            
        }
    
        public static AppContext getInstance() {
            if (instance == null){
                throw new RuntimeException();
            }
            return instance;
        }
    }
    

    对外暴露实例化单例的方法

    外界调用时,将全局的 context 对象传入

        public static void init(Context context){
            if (instance != null){
                throw new RuntimeException();
            }
            instance = new AppContext(context);
        }
    

    修改构造方法:

    • 将全局的 Context 对象保存到该单例中
        private Context applicationContext;
    
        public AppContext(Context application){
            this.applicationContext = application;
        }
    

    完整代码

    在之前的基础上,暴露获得 Context 对象的方法

    /**单例模式
     *
     * 向整个应用提供 App (application) 单例
     */
    public class AppContext {
    
        private static AppContext instance;
    
        private Context applicationContext;
    
        public AppContext(Context application){
            this.applicationContext = application;
        }
    
        public Context getApplicationContext() {
            return applicationContext;
        }
    
        public static AppContext getInstance() {
            if (instance == null){
                throw new RuntimeException();
            }
            return instance;
        }
    
        public static void init(Context context){
            if (instance != null){
                throw new RuntimeException();
            }
            instance = new AppContext(context);
        }
    
        public static boolean isInitialized(){
            return (instance != null);
        }
    }
    

    单例的实例化

    那么我们如何生成该单例能,由于单例是全剧唯一的,根据这个特性我们一般在 Application 中实例化它

    public class App extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            if (!AppContext.isInitialized()){
                AppContext.init(getApplicationContext());
            }
        }
    }
    

    单例 context 的使用

    context 的使用可以说非常广泛,例如获得程序网络功能,获得制定控件属性等等,用途可以说是非常广泛

    • 获得网络状态
    NetworkUtil.isNetworkAvailable(AppContext.getInstance().getApplicationContext()
    
    public class NetworkUtil {
        /**
         * 检查网络是否可用
         *
         * @param context
         * @return
         */
        public static boolean isNetworkAvailable(Context context) {
    
            ConnectivityManager manager = (ConnectivityManager) context
                    .getApplicationContext().getSystemService(
                            Context.CONNECTIVITY_SERVICE);
    
            if (manager == null) {
                return false;
            }
    
            NetworkInfo networkinfo = manager.getActiveNetworkInfo();
    
            if (networkinfo == null || !networkinfo.isAvailable()) {
                return false;
            }
            
            return true;
        }
    
    }
    
    • 在工具类中获得控件属性值
        /**
         * color.xml里面的id
         */
        public static int getColor(int colorResId){
            Context context = OrderContext.getInstance().getApplicationContext();
            return context.getResources().getColor(colorResId);
        }
    

    单例模式的使用非常广泛,但具体的内容基本就这些,本文主要是我学习过程中的一点总结。

    大家可以在此基础上加以改造使用,如果有其他的应用场景,欢迎在评论区中分享,一起进步~!

    相关文章

      网友评论

        本文标题:单例模式-全局可用的 context 对象,这一篇就够了

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