Android Java中如何在多个类间共享应用配置参数?
Android配置参数跨类便捷使用的解决方案
方案一:单例模式封装配置类
把配置参数封装到单例类中,只需读取一次就能全局复用,是最常用的实现方式。
代码实现
public class AppConfig { // 单例实例,volatile保证多线程可见性 private static volatile AppConfig instance; // 存储配置参数 private String dbUrl; private String dbUsername; private String dbPassword; // 私有构造,禁止外部直接实例化 private AppConfig() {} // 获取单例的方法 public static AppConfig getInstance() { if (instance == null) { synchronized (AppConfig.class) { if (instance == null) { instance = new AppConfig(); } } } return instance; } // 读取配置文件并初始化参数 public void loadConfig() { try (FileInputStream fis = new FileInputStream("/storage/emulated/0/Download/suivicourse.cfg")) { Properties prop = new Properties(); prop.load(fis); this.dbUrl = prop.getProperty("database.url"); this.dbUsername = prop.getProperty("database.username"); this.dbPassword = prop.getProperty("database.password"); } catch (IOException e) { e.printStackTrace(); } } // 提供getter方法供外部获取参数 public String getDbUrl() { return dbUrl; } public String getDbUsername() { return dbUsername; } public String getDbPassword() { return dbPassword; } }
使用方式
- 在Activity初始化时加载配置:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bind = ActivityHomeBinding.inflate(getLayoutInflater()); setContentView(bind.getRoot()); // 加载配置,全局生效 AppConfig.getInstance().loadConfig(); initView(); }
- 在任意其他类中直接调用:
// 比如数据库操作类里 String dbUrl = AppConfig.getInstance().getDbUrl(); String dbUser = AppConfig.getInstance().getDbUsername(); String dbPwd = AppConfig.getInstance().getDbPassword();
方案二:利用Application类存储全局参数
Android的Application类是全局上下文,APP启动时会初始化一次,适合存放全局配置参数。
代码实现
public class MyApp extends Application { private String dbUrl; private String dbUsername; private String dbPassword; @Override public void onCreate() { super.onCreate(); // 启动时自动加载配置 loadConfig(); } private void loadConfig() { try (FileInputStream fis = new FileInputStream("/storage/emulated/0/Download/suivicourse.cfg")) { Properties prop = new Properties(); prop.load(fis); this.dbUrl = prop.getProperty("database.url"); this.dbUsername = prop.getProperty("database.username"); this.dbPassword = prop.getProperty("database.password"); } catch (IOException e) { e.printStackTrace(); } } // getter方法 public String getDbUrl() { return dbUrl; } public String getDbUsername() { return dbUsername; } public String getDbPassword() { return dbPassword; } }
配置Application
需要在AndroidManifest.xml中指定自定义的Application类:
<application android:name=".MyApp" <!-- 其他原有配置 --> > </application>
使用方式
在任意类中通过上下文获取参数:
MyApp myApp = (MyApp) getApplicationContext(); String dbUrl = myApp.getDbUrl();
注意事项
- 存储权限:直接使用外部存储的绝对路径,Android 6.0及以上版本需要动态申请
READ_EXTERNAL_STORAGE权限,否则会抛出IO异常。 - 配置更新:上述方案都是只读取一次配置,如果需要支持配置文件修改后重新加载,可以给配置类添加
reloadConfig()方法重新读取文件。 - 安全性:数据库密码直接存在外部明文文件有泄露风险,建议对敏感配置进行加密存储,或者改用
SharedPreferences(同样需要加密处理)。
内容的提问来源于stack exchange,提问作者Pierre Tremblay
相关产品推荐
相关产品推荐

