2013-06-25 24 views
0

我有一個包含兩個包的應用程序。在com.soul.app1.plugin包中有一個FireReceiver.class(這是Tasker插件的一部分)。值存儲正常,但它被正確檢索(在第二個包 - Settings.class中)僅在第一次運行時(重新安裝後)。當我嘗試再次檢索時,檢索舊值而不是新值。SharedPreferences在包之間不起作用(在一個應用程序內)

Settings.java在com.soul.app1包:

public class Settings extends Activity { 

    @Override 
    public void onResume() { 
    super.onResume(); 

    SharedPreferences settings = getApplicationContext().getSharedPreferences("SETTINGS", 0); 
    int minVolSet = settings.getInt("value", 0); 
    } 

} 

FireReceiver.java在com.soul.app1.plugin包:

public final class FireReceiver extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(final Context context, final Intent intent) 
    { 
    SharedPreferences.Editor editor; 
    SharedPreferences settings; 
    settings = context.getApplicationContext().getSharedPreferences("SETTINGS", 0); 
    editor = settings.edit(); 

    editor.putInt("value", 2); // constant 2 is for testing purposes only 
    editor.apply(); 
    } 
} 

回答

1

最後我解決了問題,將getSharedPreferences()轉換爲MODE_MULTI_PROCESShttp://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS。所以:

getSharedPreferences("SETTINGS", 0); 

getSharedPreferences("SETTINGS", 4); 

的關鍵在於理解,這是一個事實,即每包(即使在同一應用程序)都有自己的process.I找不到這個信息讓我不得不以我自己的方式學習:)。

+0

通常,應用程序的所有組件都將在單個進程中運行,除非另有要求。但是,當涉及多個*線程*時,類似的因素可能是一個問題,這是文檔忽略評論的問題。 –

0

這裏需要後提交編輯應用新值

SharedPreferences.Editor editor; 
    SharedPreferences settings; 
    settings = context.getApplicationContext().getSharedPreferences("SETTINGS", 0); 
    editor = settings.edit(); 

    editor.putInt("value", 2); // constant 2 is for testing purposes only 
    editor.commit() 
+0

apply()完全一樣。正如我所說的「價值」存儲正確(我已經檢查過)。 – Kristopher

+0

所以當你重新安裝應用程序。首選項將被清除,並且我猜測返回了默認值。 –

+0

並且您每次都將值設置爲2,那麼我們如何驗證新值? –

-1

用於編輯共享首選項editor.commit()是必需的。

+0

'apply()'完全一樣。正如我所說的「價值」存儲正確(我已經檢查過)。 – Kristopher

相關問題