Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

简介: Android的配置文件操作封装,摒弃SharedPreference操作配置漫天乱飞

在Android项目应用中,经常会用到读取和保存配置文件。Android提供了SharedPreference类方便的对配置文件进行操作。但是,项目中到处穿梭着类似这样的代码:


public WidgetListFactory(Context context) {
    this.context = context;
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
    userId = sp.getInt(SettingsUtil.USERID, -1);
}


这样的代码,有没有让人觉得一段乱糟糟的,不但一处是,只要用到配置的地方,写法太任性,太随意了有木有?


反正只要能获取到全局的context,在需要参数读取和保存的地方,可以实现操作配置文件。


这种重复的,低效率的事,没给代码增加一点儿清晰度,还容易造成混乱。


且按照模块化的思想,应该尽可能的复用现有的成果。如果这么乱糟糟的使用起来不便还容易出错,更无法复用。


因此,有必要对配置文件的操作理一理,归归类,管理起来,方便复用,可做为一个模块来用。


在应用启动时,加载读取配置文件。在需要保存时,直接赋值并调用saveCfg()即可。


以下为按照这种思想写的一个系统配置类。


使用起来是不是很简单,很直观?


package com.example.yang.testmvvm.config;
import android.content.Context;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by yangyongzhen on 2018/08/04
 * 配置文件的全局管理,摒弃SharedPreference漫天飞
 * 系统配置SysCfg类
 * 在应用启动时,先初始化调用 SysCfg sysCfg = SysCfg.getInstance(context);
 * 接着sysCfg.readConfig();完成加载。
 * 然后全局的配置就可以使用,如sysCfg.ip.value即为IP地址的配置。
 * sysCfg.ver.value = "5678";
 * sysCfg.saveConfig();
 * 即完成了参数的保存。
 * 相比工程代码中到处穿梭的
 * SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
 * userId = sp.getInt(SettingsUtil.USERID, -1);
 * 是不是更清晰?更简单?更直观?
 */
public final class SysCfg {
    public static final String TAG = "SysCfg"; //做为配置文件的文件名
    private static Context context;
    private static SysCfg instance = null;
    SharedPreferencesHelper helper;
    public class Field{
        public String key;
        public String value;
        public Field(){
            key   = "null";
            value = "null";
        }
    }
    List<Field> list;
    //fields,步骤1,用到的配置
    public  Field ver = new Field(); //版本
    public  Field ip =  new Field(); //IP地址
    public  Field port= new Field(); //端口
    public  Field username = new Field(); //用户名
    public  Field password = new Field(); //密码
    /**
     * 需要增加或删除的变量配置都在这里修改
     * @param contx
     */
    private SysCfg(Context contx) {
        context = contx;
        helper = new SharedPreferencesHelper(context,TAG);
        list = new ArrayList<>();
        //步骤2:配置key
        ver.key  = "ver";
        ip.key   = "ip";
        port.key = "port";
        username.key = "username";
        password.key = "password";
        //步骤3:添加到list
        list.add(ver);
        list.add(ip);
        list.add(port);
        list.add(username);
        list.add(password);
    }
    /**
     * 保存参数时只需赋值,然后调用saveConfig()即可。
     * @return
     */
    public int saveConfig(){
        for(Field filed :list){
            helper.put(filed.key,filed.value);
        }
        return 0;
    }
    /**
     *仅在应用启动时加载一次,调用readConfig();
     * @return
     */
    public int readConfig(){
        for(Field filed :list){
            helper.get(filed.key,filed.value);
        }
        return 0;
    }
    public void printConfig(){
        String str="";
        for(Field filed :list){
            str += String.format("key=%s,value= %s\n",filed.key,filed.value);
        }
        Log.d(TAG, str);
    }
    public static SysCfg getInstance(Context contx){
        if(instance == null){
            instance = new SysCfg(contx);
        }
        return instance;
    }
}


package com.example.yang.testmvvm.config;
import android.content.Context;
import com.example.yang.testmvvm.utils.LogUtil;
import java.util.ArrayList;
import java.util.List;
public class OthCfg {
    public static final String TAG = "OthCfg"; //做为配置文件的文件名
    private static Context context;
    private static OthCfg instance = null;
    SharedPreferencesHelper helper;
    public class STRING{
        private String key;
        public  String value;
        public STRING(String skey,String svalue){
            key   = skey;
            value = svalue;
        }
    }
    public class LONG{
        private String key;
        public  long value;
        public LONG(String skey,long lvalue){
            key   = skey;
            value = lvalue;
        }
    }
    List<Object> list;
    //fields,步骤1,用到的配置
    public  LONG cardRecCout =  new LONG("cardRecCout",0); //记录数量统计
    public  LONG cardRecMone =  new LONG("cardRecMone",0); //记录金额统计 汇总
    public  LONG sendRecNum  =  new LONG("sendRecNum",0); //已上传的记录数目 汇总
    /**
     * 需要增加或删除的变量配置都在这里修改
     * @param contx
     */
    private OthCfg(Context contx) {
        context = contx;
        helper = new SharedPreferencesHelper(context,TAG);
        list = new ArrayList<>();
        //步骤2:添加到list
        list.add(cardRecCout);
        list.add(cardRecMone);
        list.add(sendRecNum);
    }
    /**
     * 保存参数时只需赋值,然后调用saveConfig()即可。
     * @return
     */
    public int saveConfig(){
        for(Object obj : list){
            if(obj instanceof STRING){
                helper.put(((STRING)obj).key, ((STRING)obj).value);
            }else if(obj instanceof LONG) {
                helper.put(((LONG)obj).key, ((LONG)obj).value);
            }
        }
        return 0;
    }
    /**
     *仅在应用启动时加载一次,调用readConfig();
     * @return
     */
    public int readConfig(){
        for(Object obj : list){
            if(obj instanceof STRING){
                helper.get(((STRING)obj).key, ((STRING)obj).value);
            }else if(obj instanceof LONG) {
                helper.get(((LONG)obj).key, ((LONG)obj).value);
            }
        }
        return 0;
    }
    public void printConfig(){
        String str="";
        for(Object obj : list){
            if(obj instanceof STRING){
                str += String.format("key=%s,value= %s\n",((STRING)obj).key,((STRING)obj).value);
            }else if(obj instanceof LONG) {
                str += String.format("key=%s,value= %d\n",((LONG)obj).key,((LONG)obj).value);
            }
        }
        LogUtil.d(str);
    }
    public static OthCfg getInstance(Context contx){
        if(instance == null){
            instance = new OthCfg(contx);
        }
        return instance;
    }
}


package com.example.yang.testmvvm.config;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Map;
/**
 * 对SharedPreferences的操作管理类
 */
public class SharedPreferencesHelper {
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;
    public SharedPreferencesHelper(Context context, String FILE_NAME) {
        sharedPreferences = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }
    /**
     * 存储
     */
    public void put(String key, Object object) {
        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }
        editor.commit();
    }
    /**
     * 获取保存的数据
     */
    public Object get(String key, Object defaultObject) {
        if (defaultObject instanceof String) {
            return sharedPreferences.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sharedPreferences.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sharedPreferences.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sharedPreferences.getLong(key, (Long) defaultObject);
        } else {
            return sharedPreferences.getString(key, null);
        }
    }
    /**
     * 移除某个key值已经对应的值
     */
    public void remove(String key) {
        editor.remove(key);
        editor.commit();
    }
    /**
     * 清除所有数据
     */
    public void clear() {
        editor.clear();
        editor.commit();
    }
    /**
     * 查询某个key是否存在
     */
    public Boolean contain(String key) {
        return sharedPreferences.contains(key);
    }
    /**
     * 返回所有的键值对
     */
    public Map<String, ?> getAll() {
        return sharedPreferences.getAll();
    }
}


相关文章
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
73 0
玩转安卓之配置gradle-8.2.1
|
3月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
132 1
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
234 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
189 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
115 3
|
3月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
112 12
|
3月前
|
移动开发 JavaScript 开发工具
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
|
3月前
|
Shell Android开发
安卓scheme_url调端:在AndroidManifest.xml 中如何配置 Intent-filter?
为了使Android应用响应vivo和oppo浏览器的Deep Link或自定义scheme调用,需在`AndroidManifest.xml`中配置`intent-filter`。定义启动的Activity及其支持的scheme和host,并确保Activity可由外部应用启动。示例展示了如何配置HTTP/HTTPS及自定义scheme,以及如何通过浏览器和adb命令进行测试,确保配置正确无误。
|
3月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
41 0