2014-03-01 47 views
2

(稍有不同的問題另外一個我剛剛發佈,道歉,如果這是違反規則的)我設置一些共享偏好Sharedpreferences不可訪問,

在我的活動1,接下來我開始另一個activity2通過intent並設置sharedpreferences的一些textviews ...這一切工作正常。

繼承人我的問題。 在我的第一個activity1中,我有一個alarmmanger,它有一個掛起的意圖,這個掛起的意圖是一個廣播接收器,用於鎖定電話,然後啓動activity2。這項活動與上述第二項活動相同。但是,當此活動從broadcastreceiver開始時,沒有任何文字瀏覽從sharedpreferences加載。這隻發生在從broadcastreceiver開始活動2時。

SharedPreference在活動一個被設置爲

SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE); 

中活性2相同的方式

SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE); 

進行訪問,我可以那麼的getString等

當活性2從廣播接收器開始,沒有任何sharedprefs已經加載。

broadcastreceiver是一個不同的包名稱,我將它移動到與測試活動相同的包中,但它沒有區別。

其驅使我瘋了,請幫忙! 感謝

編輯

我有一個GCMIntentService,這是我設置的共享首選項(基於從GCM接收的值)(我只包括相關的代碼)

public class GcmIntentService extends IntentService { 

public static final String PREFERENCE_NAME = "lockPreference"; 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     SharedPreferences lockPreference = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor lockPrefsEditor; 
     lockPrefsEditor = lockPreference.edit(); 

lockPrefsEditor.putString("newpassword", newpassword); 
lockPrefsEditor.commit(); 

現在如果我啓動activity2,則會正確讀取共享的首選項。 儘管首次嘗試從廣播接收器進行訪問,但它並不工作。

這是一個測試接收機

package com.myapp; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.util.Log; 
import android.widget.Toast; 

public class test extends BroadcastReceiver { 


    public static final String TAG = "myapp"; 
    public static String newpassword = ""; 


@Override 
public void onReceive(Context context, Intent intent) { 


     Log.i(TAG,"test receiver"); 

     SharedPreferences lockPreference = context.getSharedPreferences(GcmIntentService.PREFERENCE_NAME, Context.MODE_PRIVATE); 
     newpassword = lockPreference.getString("newpassword", ""); 
     Log.i(TAG, "Password from shared prefs: " + newpassword); 

     Toast.makeText(context, "Sharedprefs password:" + newpassword, Toast.LENGTH_SHORT).show(); 


     } 
} 

的烤麪包只是顯示Sharedprefs密碼:

這是活性2,可以讀出首選項沒有問題

public class Activity2 extends Activity { 


    String newpassword; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.set); 


     //retrieve shared prefs 
     SharedPreferences lockPreference = getSharedPreferences(GcmIntentService.PREFERENCE_NAME, Context.MODE_PRIVATE); 
newpassword = lockPreference.getString("newpassword", ""); 

然後我可以做一個toast或其他什麼。

我不明白爲什麼它的廣播接收機失敗,是不是相同的上下文?

+0

粘貼並刪除了代碼?它解決了嗎? – user2450263

+0

請從所有您嘗試訪問SharedPreferences的地方顯示代碼 - BroadcastReceiver代碼顯然是調試代碼,但您不會在上下文中顯示Activity2代碼。 –

回答

2

首先,你應該知道,你的方法getSharedPreference創建SharedPreference文件被表示爲一個真正的XML文件在你的應用程序目錄中,所以如果你已經加入你的價值觀和提交您的修改,然後所有編輯應存在。

其次,在項目中擁有BroadcastReceiver類應該與您的項目採用相同的PackageName,即使它在應用程序關閉時啓動。

現在你有什麼要確保的是以下幾點:

1)兩個Activities使用相同的SharedPReference文件通過創建應用程序中的publicconstant持有的文件名。

public final static String PREFERENCE_NAME = "com.example.mypackage.preference" 

2)兩個Activities使用相同的SharedPReference文件如下

SharedPreferences lockPreferences = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); 

3)請確保您的修改可在其他文件之前嘗試閱讀COMMITED。

lockPreferences.putBoolean(CONSTANT_KEY, true); 
commit(); 
+0

感謝您的幫助,我添加了一個公共常量,但它仍然不起作用 – Gary

+0

不要說它不起作用。總是說出你得到的例外或者你有問題的線路。如果您使用的偏好正如我所提到的那樣,您不會有任何問題 –

+0

沒有任何異常,所以證明很難排除故障......我已經編輯了上面的內容來顯示我的測試 – Gary

3

除了什麼Adb El-Rahman said,該SharedPreferences是基於您使用context XML文件加載。

正如您所看到的,您正在使用傳遞到BroadcastReceiver的上下文,該上下文可能不是您的應用程序的上下文,因此將引用不同的首選項文件。這將是一個ReceiverRestrictedContext實例。

但是,根據@CommonsWare's answer to another question,您應該可以通過在BroadcastReceiver內撥打context.getApplicationContext()來使其工作。


順便說一句,你要小心一個BroadcastReceiver內沒有運行太多的程序代碼的 - 這似乎系統不喜歡這樣。

+0

我怎麼知道上下文是否正確?我只是指定了context.getSharedPreferences ...它在activity2中工作,但在BroadcastReceiver的javadoc中不是broadcastreceiver – Gary

+0

,它將上下文定義爲「接收器正在運行的上下文」。我認爲這意味着它可以是製作廣播的應用程序,而不是您的應用程序。但是'Activity'是一個'Context',它被鏈接到你的應用程序。所以基本上不要把這些代碼放到BroadcastReceiver中,而是放到Activity或Service中。讓您的BroadcastReceiver代碼非常簡短,以避免出現問題。 –

+0

@Gary我發現一個相關的問題,表明你應該能夠從你的接收器訪問你的'SharedPreferences'。我仍然認爲這是生產中的一個壞主意,但我可以看到你正在嘗試一些基本的調試。有興趣知道您是否可以使用getApplicationContext()來工作? –