当前位置: 首页 > 知识库问答 >
问题:

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

公冶泰
2023-03-14

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

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

这就是我的问题。在我的第一个活动1中,我有一个带有挂起意图的警报管理器,这个挂起意图是一个用于锁定手机的广播接收器,然后启动活动2。这个活动和上面提到的第二个活动是一样的。但是,当此活动从广播接收器启动时,没有任何文本视图从共享偏好加载。这只发生在从广播接收器启动活动2时。

SharedReference在活动一中设置为

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

在activity2中访问的方式相同

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

然后我可以得到字符串等

当从广播接收器启动活动2时,没有一个共享资源被加载。

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

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

编辑

我有一个GCMinentService,这是我设置共享pref的地方(基于从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,共享的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密码:

这是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", "");

然后我可以做一个烤面包片或其他什么。

我不明白广播接收机为什么会失败,是不是上下文不同??

共有2个答案

司马飞鸿
2023-03-14

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

其次,在您的项目中拥有一个BroadcastRecector类应该使用与您的项目相同的PackageName,即使它是在您的应用程序关闭时启动的。

现在,您需要确保的是:

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

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

2)两个活动使用相同的SharedP参考文件,如下所示

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

3) 确保在其他文件尝试读取之前提交您的编辑。

lockPreferences.putBoolean(CONSTANT_KEY, true);
commit();
夏侯星洲
2023-03-14

除了Adb El-Rahman所说的之外,根据您使用的上下文,将从XML文件加载Shared首选项

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

然而,根据@Common sWare对另一个问题的回答,您应该能够通过调用BroadcastRecector中的context.getApplication ationContext()来使其工作。

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

 类似资料:
  • 我目前正在使用SharedReferences跟踪通过AlarmManager启动的BroadcastReceiver中要执行工作的项列表。除了一个特定的场景外,一切都很好。当我触发一个新项目来执行工作时,让它完成工作,然后删除该项目(全部通过SharedReferences编辑),它在应用程序运行时工作得很好。当列表中没有任何内容,我打开任务管理器并终止应用程序时,该项突然出现在Broadcas

  • 每当它收到消息时,它都会在后台运行,即使应用程序没有运行,它也应该从后台启动活动

  • 即使使用Intent,该活动也不会从引导完成的onRecture的广播接收器开始。FLAG_ACTIVITY_NEW_TASK没有帮助,仍然经历同样的错误。 原因:Android。util。AndroidRuntimeException:从活动上下文外部调用startActivity()需要标志_Activity_NEW_TASK标志。这真的是你想要的吗?

  • 我有一个广播接收器,它使用以下代码启动活动a A活动启动正常,然后我按下一个按钮,使用此代码启动另一个活动B 活动B开始很好,但我按下后退按钮还是向上按钮活动A没有显示 这是清单字段中两个活动的定义 在活动B中,我有以下代码 我试图调试,我认为问题是当我从广播接收器调用活动A时,FLAG_ACTIVITY_NEW_TASK导致意图同时具有动作(android.intent.action.主)和类别

  • 我在试着让我的弹性搜索下沉并运行。然而,我得到了以下错误,并正在耗尽如何修复它的想法。任何帮助都很感激。以下是错误: 我运行的是CDH 5.3和elasticsearch 1.4.2

  • 我需要一些帮助来理解当我可以期望我的广播接收器在清单中注册时工作,而不是必须从正在运行的活动或服务中注册。 因此,例如,如果我用以下意图筛选器注册了一个独立的接收器,那么它在没有对它的服务/活动引用的情况下就能正常工作: 但是,如果将替换为,则不会触发接收器(Android文档) 从我在这个站点上发现的,你必须从一个已经运行的活动或服务中注册这个接收器,以使其工作(Post)。 > 有人能告诉我,