2014-10-12 214 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(); 

    ... 
} 
相關問題