Android 从广播接收器启动活动时无法访问SharedReferences

Android 从广播接收器启动活动时无法访问SharedReferences,android,broadcastreceiver,sharedpreferences,Android,Broadcastreceiver,Sharedpreferences,(与我刚刚发布的另一个问题略有不同,如果这违反了规则,请道歉) 在我的活动1中,我正在设置一些共享首选项,接下来我将通过意图启动另一个活动2,并从SharedReferences中设置一些文本视图。。。这一切都很好 这是我的问题。 在我的第一个活动1中,我有一个带有挂起意图的alarmmanger,该挂起意图是一个广播接收器,用于锁定手机,然后启动活动2。此活动与上述第二项活动相同。但是,当从广播接收器启动此活动时,没有从共享参考加载任何文本视图。这仅在从广播接收器启动activity2时发生

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

在我的活动1中,我正在设置一些共享首选项,接下来我将通过意图启动另一个活动2,并从
SharedReferences
中设置一些文本视图。。。这一切都很好

这是我的问题。 在我的第一个活动1中,我有一个带有挂起意图的
alarmmanger
,该挂起意图是一个广播接收器,用于锁定手机,然后启动活动2。此活动与上述第二项活动相同。但是,当从
广播接收器
启动此活动时,没有从
共享参考
加载任何文本视图。这仅在从
广播接收器启动activity2时发生

SharedReference
在活动一中设置为

SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE);
在activity2中访问的方式相同

SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE);
然后我可以得到字符串等

从broadcastreceiver启动activity2时,没有加载任何SharedPref

broadcastreceiver
位于不同的包名中,我将其移动到与测试活动相同的包中,但没有任何区别

快把我逼疯了,请帮帮我! 谢谢

编辑

我有一个GCMinentService,这是我设置共享pref的地方(基于从GCM接收到的值)(我只包含了相关代码)

现在,如果我启动activity2,共享的pref将被正确读取。 但是,当尝试首先从广播接收器访问时,它不起作用

这是一个测试接收机:

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密码:

这是活动2,可以毫无问题地读取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", "");
然后我可以做一个
烤面包片
或其他什么


我不明白广播接收器为什么会失败,它不是同一个上下文吗?

首先,您应该知道,您通过方法
getSharedReference
创建的
SharedReference
文件在应用程序目录中表示为真实的
XML
文件,因此,如果您已经添加了值并提交了修改,那么所有编辑都应该存在

其次,在项目中使用
BroadcastReceiver
类应该使用与项目相同的
PackageName
,即使它是在应用程序关闭时启动的

现在,您需要确保的是:

1) 两个
活动
通过在应用程序中创建一个保存文件名的
public
常量
来使用相同的
SharedReference
文件

public final static String PREFERENCE_NAME = "com.example.mypackage.preference"
2) 两个
活动
使用相同的
SharedReference
文件,如下所示

SharedPreferences lockPreferences = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
3) 确保在其他文件尝试读取之前提交您的编辑

lockPreferences.putBoolean(CONSTANT_KEY, true);
commit();
除此之外,
SharedReferences
是根据您使用的
上下文从XML文件加载的

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

但是,根据,您应该能够通过在
广播接收器内调用
context.getApplicationContext()
使其工作



另一方面,您应该注意不要在
广播接收器中运行太多的代码
——系统似乎不喜欢这样。

粘贴并删除了代码?问题解决了吗?请显示您尝试访问共享引用的所有位置的代码-BroadcastReceiver代码显然是调试代码,但您没有在上下文中显示Activity2代码。感谢您的帮助,我添加了一个公共常量,但它仍然不起作用。不要说它不起作用。总是说你遇到的例外情况或你有问题的那句话。如果您正确地使用了我提到的首选项,您将不会有任何问题。没有例外,因此很难排除故障。。。我已经编辑了上面的内容来展示我的测试不要问我怎么做,但是在添加了公共常量之后,我清理了这个项目,它现在可以工作了。。。感谢allI,如果您使用Eclipse,我相信您:)@加里,如果你觉得我的答案有用的话,请别忘了投赞成票:)Thnx我怎么知道上下文是否正确?我只是指定了context.getSharedReferences。。。这在activity2中有效,但在javadoc for
BroadcastReceiver
中不适用于BroadcastReceiver,它将上下文定义为“接收器运行的上下文”。我认为这意味着它可以是制作广播的应用程序,而不是您的应用程序。但是
活动
是链接到应用程序的
上下文
。所以基本上不要把这些代码放到广播接收器中,而是放到一个活动或服务中。保持您的广播接收器代码非常简短,以避免出现问题。@Gary我发现一个相关问题,建议您应该能够从接收器访问您的
SharedReferences
。我仍然认为这在生产中是个坏主意,但我可以看出您正在尝试一些基本的调试。有兴趣知道您是否可以使用
getApplicationContext()
Yes使其工作,谢谢。。。我在接收器中做的不多,但我需要从sharedprefs设置1或2个值。。。。现在全部工作:-)
lockPreferences.putBoolean(CONSTANT_KEY, true);
commit();