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

Android 在活动之间共享全局变量的最佳实践,android,Android,对于如何在一个被认为是安全的android项目中的活动之间共享全局变量,我有点困惑 这样做的最佳实践是什么?扩展应用程序类还是创建自定义单例类 感谢您的帮助,提前谢谢 这样做的最佳实践是什么?扩展应用程序类或 创建一个自定义的单例类 仔细考虑这些变量是否真的是全局变量,它们是否必须在活动之间共享 如果第一个问题的答案是“是”,那么最好将它们存储在应用程序中 您也可以实现一个单例,但是1)测试稍微困难一些,b)如果您的全局变量需要上下文,然后,应用程序实例将是最合适的。在应用程序类中存储某些内容的

对于如何在一个被认为是安全的android项目中的活动之间共享全局变量,我有点困惑

这样做的最佳实践是什么?扩展应用程序类还是创建自定义单例类

感谢您的帮助,提前谢谢

这样做的最佳实践是什么?扩展应用程序类或 创建一个自定义的单例类

  • 仔细考虑这些变量是否真的是全局变量,它们是否必须在活动之间共享
  • 如果第一个问题的答案是“是”,那么最好将它们存储在
    应用程序中

  • 您也可以实现一个单例,但是1)测试稍微困难一些,b)如果您的全局变量需要
    上下文
    ,然后,应用程序实例将是最合适的。

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

    下面是一篇非常好的博客文章,解释了存储在应用程序类中的数据是如何丢失的:

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

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

    它的基本过程是:

    当我通过以下方式将值保存在此对象中时:

    mPersistData.saveEmailId("me@example.com");
    
  • 我首先将其写入SharedReferences中的一个条目
  • 然后将其保存到成员变量中
  • 在类的构造函数中,我通过从SharedReferences读取成员变量来初始化它们。 通过这种方式,变量的读取被“缓存”,即不需要从SharedReferences读取,并且如果应用程序被终止并重新启动,则成员变量具有正确的值。如果您只保留应用程序类中的值,则当应用程序重新启动时,成员变量将无效(不是您所期望的,甚至不是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;
        }
    }
    
    在我的应用程序匕首模块中,我有:

    @Provides @Singleton
    public PersistData providePersistData () {
        System.out.println(String.format("mApp = %s", mApp));
        return new PersistData(mApp);
    }
    
    然后,每当我需要访问这些变量中的任何一个时,我都会按如下方式注入singleton:

    public class HomePresenter {
        @Inject
        PersistData mPersistData;
        ...
    
        mPersistData.saveEmailId("me@example.com");
        myEmail = mPersistData.getEmailId();
    
       ...
    }
    

    你能解释一下你到底想达到什么目的或者解决什么问题吗?使用
    Application
    class