在活动之间共享全局变量的最佳实践

时间:2014-10-12 10:36:45

标签: android

我对如何在安全的Android项目中的活动之间共享全局变量感到有点困惑。

这样做的最佳做法是什么?扩展Application类或制作自定义单例类?

提前感谢帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

在应用程序类中存储内容的问题是,您不能指望从应用程序对象的同一实例恢复的活动。例如,可以暂停活动,应用程序被杀死(由于内存)以及您在实例中对对象所做的任何更改,然后使用新的应用程序实例恢复活动。

这是一篇非常好的BLOG帖子,解释了如何丢失应用程序类中存储的数据: http://www.developerphil.com/dont-store-data-in-the-application-object

我不确定这是非常“最佳”的做法,但我认为这是一个很好的解决方案

我有一个PersistData类拥有应用程序范围的“全局”。我使用Dagger将这个单例的实例注入到需要这些变量的任何类中。

基本过程:

当我通过以下内容保存此对象中的值时:

mPersistData.saveEmailId("me@example.com");
  1. 我首先将其写入SharedPreferences
  2. 中的条目
  3. 然后我将其保存为成员变量
  4. 在类的构造函数中,我通过从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)

  

这样做的最佳做法是什么?扩展应用程序类或   制作自定义单例类?

  1. 请想一想这些变量是否真的是全局的,并且必须在活动之间共享。
  2. 如果对第一个问题的回答是“是”,那么最好的地方就是将它们存储在Application中。
  3. 您也可以实现单例,但1)测试稍微困难一点,b)如果您的全局变量需要Context,那么Application实例再次最适合。