2014-10-12 165 views
2

我对如何在认为安全的android项目中的活动之间共享全局变量有点混淆。在活动之间共享全局变量的最佳实践

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

帮助很重要,在此先感谢。

+1

你能解释一下你究竟想要达到什么样的目的或解决什么问题吗? – Asahi 2014-10-12 10:55:38

+0

使用'Application'类https://www.intertech.com/Blog/androids-application-class/ – 2017-12-21 04:13:26

回答

0

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

  1. 三思而后这些变量是否是真正的全球和他们要活动之间共享。
  2. 如果第一个问题的答案是'是',那么最好的地方是将它们存储在Application中。

您可以实现单过,但1)它稍微难以测试和b)如果你的全局变量需要Context,然后再次Application例如将适合最好。

3

在应用程序类中存储某些内容的问题是,您无法依赖于应用程序对象的同一实例中正在恢复的活动。例如,一个活动可以暂停,应用程序被杀死(由于内存)以及您在实例中对对象进行的任何更改,然后该活动将恢复为新的应用程序实例。

这是一个非常好的博客文章,解释存储在应用程序级的数据如何可能会丢失: http://www.developerphil.com/dont-store-data-in-the-application-object

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

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

的基本过程是这样的:

当我通过像保存在这个对象的值:

mPersistData.saveEmailId("[email protected]"); 
  1. 我第一次写在SharedPreferences条目
  2. 我然后保存它到一个成员变量

在该类的构造函数中,我初始化通过从SharedPreferences中读取成员变量。 这种方式读取的变量是“缓存”的,即它们不需要从SharedPreferences读取,并且如果应用程序被终止并重新启动,则成员变量具有正确的值。如果你只是在应用程序类中保存这些值,那么当应用程序重新启动时,成员变量将是无效的(不是你期望的甚至为空)。

下面是一个例子:

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); 
} 

然后,每当我需要访问这些变量我注入单身为这样的:

public class HomePresenter { 
    @Inject 
    PersistData mPersistData; 
    ... 

    mPersistData.saveEmailId("[email protected]"); 
    myEmail = mPersistData.getEmailId(); 

    ... 
} 
相关问题