我对如何在安全的Android项目中的活动之间共享全局变量感到有点困惑。
这样做的最佳做法是什么?扩展Application类或制作自定义单例类?
提前感谢帮助表示赞赏。
答案 0 :(得分:3)
在应用程序类中存储内容的问题是,您不能指望从应用程序对象的同一实例恢复的活动。例如,可以暂停活动,应用程序被杀死(由于内存)以及您在实例中对对象所做的任何更改,然后使用新的应用程序实例恢复活动。
这是一篇非常好的BLOG帖子,解释了如何丢失应用程序类中存储的数据: http://www.developerphil.com/dont-store-data-in-the-application-object
我不确定这是非常“最佳”的做法,但我认为这是一个很好的解决方案
我有一个PersistData类拥有应用程序范围的“全局”。我使用Dagger将这个单例的实例注入到需要这些变量的任何类中。
基本过程:
当我通过以下内容保存此对象中的值时:
mPersistData.saveEmailId("me@example.com");
在类的构造函数中,我通过从SharedPreferences中读取成员变量来初始化它们。 这种方式对变量的读取是“缓存的”,即不需要从SharedPreferences读取它们,如果应用程序被杀死并重新启动,则成员变量具有正确的值。如果只保留应用程序类中的值,则在重新启动应用程序时,成员变量将无效(不是您期望的甚至是null)。
以下是一个例子:
public class PersistData {
private String email;
public PersistData(MyApp app) {
mApp = app;
email = readEmailId();
}
public void saveEmailId(String emailToSave) {
writeEmailId(emailToSave);
email = emailToSave;
}
private void writeEmailId(String emailId) {
generalSettingsFileEditor.putString("USER_ID", emailId);
generalSettingsFileEditor.commit();
}
public String readEmailId() {
String emaiId = generalSettingsFile.getString("USER_ID","");
return(emaiId);
}
public String getEmail() {
return email;
}
}
在我的应用程序Dagger模块中,我有:
@Provides @Singleton
public PersistData providePersistData () {
System.out.println(String.format("mApp = %s", mApp));
return new PersistData(mApp);
}
然后每当我需要访问这些变量中的任何一个时,我都会注入单例:
public class HomePresenter {
@Inject
PersistData mPersistData;
...
mPersistData.saveEmailId("me@example.com");
myEmail = mPersistData.getEmailId();
...
}
答案 1 :(得分:0)
这样做的最佳做法是什么?扩展应用程序类或 制作自定义单例类?
Application
中。您也可以实现单例,但1)测试稍微困难一点,b)如果您的全局变量需要Context
,那么Application
实例再次最适合。