项目中需求是:server发指令需要动态修改app连接服务的地址,

地址是写在Properties配置文件中的,需要动态修改,使用网上的方法,没有生效。

我自己研究明白了,mark一下。

首先,我们知道获取Properties的值,有2中方法:

方法一:

  property.load(context.getAssets().open("zhihui.properties"));

方法二:

 properties.load(context.openFileInput("zhihui.properties"));

这两种方法,加载的是同一个zhihui.properties文件吗?

答:不是。 

来看一张图:

左边的properties文件1:是我们项目中的文件。

右边的properties文件2:是安装到手机上以后,执行android代码生成的的文件。默认是不存在的。

回过头来说,上面的两个方法:

方法一的代码,加载的是左边的文件1。

方法二的代码,加载的是右边的文件2。

来说修改properties没有生效的原因:

左边的properties文件1,是不能修改的

右边的properties文件2,是可以修改的。

我们应该修改的是:文件2,并且,从文件2中获取配置信息。

那么,如何生成文件2呢?代码如下:


    //初始化配置文件
    //最好放在Application中,初始化。
    public static String initProperties(Context context) {
        Properties props = new Properties();
        try {
            props.load(context.getAssets().open("zhihui.properties"));
            FileOutputStream out = context.openFileOutput("zhihui.properties",Context.MODE_PRIVATE);
            props.store(out, null);
        } catch (Exception e) {
            e.printStackTrace();
            return "修改配置文件失败!";
        }
        return "设置成功";
    }

这样,就生成的一个文件2,内容和文件1是一模一样的。

其实,就是把文件1的内容复制到了文件2中。

然后,我们在设置和获取的时候,都对这个文件2进行操作就可以了。

代码如下:

获取:

/**
     * 获取
     */
    public String getUrl(Context context) {
        String url = null;
        try {
            property.load(context.openFileInput("zhihui.properties"));
            url = property.getProperty("host");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

设置:


    //修改配置文件
    public static String setProperties(Context context, String keyName, String keyValue) {
        Properties properties = new Properties();
        try {
            properties.load(context.openFileInput("zhihui.properties"));
            properties.setProperty(keyName, keyValue);
            FileOutputStream out = context.openFileOutput("zhihui.properties",Context.MODE_PRIVATE);
            properties.store(out, null);
        } catch (Exception e) {
            e.printStackTrace();
            return "修改配置文件失败!";
        }
        return "设置成功";
    }

这样就ok了。

更多工具:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐