当活动从广播接收器开始时,共享偏好不可访问

时间:2014-03-01 13:36:35

标签: android broadcastreceiver sharedpreferences

(与我刚刚发布的另一个问题略有不同,如果这违反规则则道歉)

在我的activity1中我设置了一些共享首选项,然后我通过意图启动另一个activity2并设置sharedpreferences的一些文本视图...这一切都正常。

继承我的问题。 在我的第一个activity1中,我有一个具有待定意图的alarmmanger,这个待定意图是用于锁定手机的广播接收器,然后启动activity2。此活动与上述第二项活动相同。但是,从broadcastreceiver开始此活动时,没有任何文字视图已从sharedpreferences加载。这仅在从broadcastreceiver启动activity2时发生。

SharedPreference在活动1中设置为

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

以相同的方式在activity2中访问

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

然后我可以getString等

当从broadcastreceiver启动activity2时,没有加载任何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();


        }
}

toast只显示Sharedprefs密码:

这是 activity2 ,可以读取prefs没问题

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或其他任何内容。

我不明白为什么它的广播接收器失败了,是不是同一个背景?

2 个答案:

答案 0 :(得分:3)

除了Adb El-Rahman said之外,还会根据您使用的SharedPreferences从XML文件中加载context

正如您所看到的,您正在使用传递到BroadcastReceiver的上下文,这可能不是您应用的上下文 - 因此将引用不同的首选项文件。它将是一个ReceiverRestrictedContext实例。

但是,根据@CommonsWare's answer to another question,您应该可以通过在context.getApplicationContext()内调用BroadcastReceiver来使其正常工作。


顺便说一句,你应该注意不要在BroadcastReceiver内运行太多代码 - 系统似乎不喜欢这样。

答案 1 :(得分:2)

首先,您应该知道通过方法SharedPreference创建的getSharedPreference文件在您的app目录中表示为真实的XML文件,因此如果您已经添加了值并提交您的修改,然后您的所有编辑都应该存在。

其次,在您的项目中拥有BroadcastReceiver课程,即使在您的应用关闭时启动,也应该使用相同的PackageName项目。

现在您需要确保的是以下内容:

1)两个Activities使用相同的SharedPReference文件,方法是在应用程序中创建一个包含文件名的public constant

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

2)两个Activities都使用与以下相同的SharedPReference文件

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

3)确保在另一个文件尝试阅读之前提交您的编辑。

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