30

我正在開發一個android應用程序。我使用的是Android 2.2的我可以從服務中的共享偏好設置獲取數據嗎?

在我的申請,我捕捉GPS數據並將其發送與1小時的時間間隔來服務。如果用戶退出應用程序,它也在工作(這是必需的)。

我使用2個服務(用戶定義的),一個用於捕獲GPS數據和其他用於發送到服務器。

這裏我懷疑

  • 在服務,我們可以使用共享偏好。

  • 如果我們存儲在應用程序的任何活動中共享偏好的任何數據,我們將能夠使用這些數據服務與共享偏好的幫助?

+0

最佳答案在這裏找到http://stackoverflow.com/questions/6446221/get-context-in-a-service?lq=1 –

回答

11


我找到解決方案。
內部,我們調用以下方法來獲取共享偏好

myapp.bmodel.getApplicationContext().getSharedPreferences("myPrefs_capture_gps_per_hour", Context.MODE_PRIVATE); 


在上面的代碼服務的myapp是應用類的一個對象,其從應用

7

您需要一個上下文才能訪問共享首選項。最好的辦法是創建MyApplicationApplication類的子類,實例那裏preferences和應用程序的其餘部分使用它們作爲MyApplication.preferences

public class MyApplication extends Application { 
    public static SharedPreferences preferences; 

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

     preferences = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE); 

例如,如果你需要你的喜好訪問其他地方,你可以把這種閱讀喜好:

String str = MyApplication.preferences.getString(KEY, DEFAULT); 

或者,你可以調用這個東西保存到首選項:

MyApplication.preferences.edit().putString(KEY, VALUE).commit(); 

(不要忘了添加或更改的偏好後打電話到commit()!)

+2

這在技術上的工作,但你爲什麼不只是使用提供'PreferenceManager #getDefaultSharedPreferences(上下文上下文);'靜態方法?這正是它的目的。 – twaddington

+1

@twaddington你應該仔細閱讀。當'context'是** not **可用時,我的答案允許訪問首選項。 – lenik

+2

當然,但他特別要求在「活動」和「服務」中使用共享首選項,這兩者都具有「上下文」可用。 – twaddington

5

是Shivkumar,你,你正在使用你的活動可以使用任何類型的服務,正常的你的共享偏好。

同樣喜歡

SharedPreferences preferences = getSharedPreferences("<PrefName>", 
      MODE_PRIVATE); 
+0

簡單!同樣,對於getResources,getString等... IntentService類從Context繼承。 –

35

您可以通過調用PreferenceManager.getDefaultSharedPreferences(Context context)訪問默認共享偏好的實例,這是在所有ActivityService類共享:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

這是偉大的存儲簡單基元(如布爾值)或可序列化的對象。但是,如果您捕獲了大量的位置數據,則可以考慮使用SQLite數據庫。

+1

此答案與此結合:在服務中的onStart或onStartCommand之前服務中的上下文將不可見:http://stackoverflow.com/questions/7619917/how-to-get-context-in-android-service-class爲我解決了這個問題。 – class

+0

您可以始終傳遞服務的getApplicationContext()方法的結果。 – twaddington

+0

@twaddington因此,如果我們使用'getSharedPreferences(String,Context)',則不會共享首選項? – Sohaib

1

有衍生兩種方式的SharedPreference創建實例:

案例1:

SharedPreferences preferences = activity.getSharedPreferences("<PrefName>", MODE_PRIVATE); 

案例2:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

注意,如果您創建具有相同的名稱(案例1)或相同的情況下(情況2)即使在不同地方的偏好,它仍然是相同的,並能共享數據,顯然。