gpt4 book ai didi

android - 从广播接收器启动 Activity 时无法访问共享首选项

转载 作者:太空狗 更新时间:2023-10-29 16:38:35 26 4
gpt4 key购买 nike

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

在我的 activity1 中,我正在设置一些共享首选项,接下来我通过 intent 启动另一个 activity2 并从 sharedpreferences 设置一些 TextView ......这一切都很好。

这是我的问题。在我的第一个 activity1 中,我有一个带有待定 Intent 的 alarmmanger,这个待定 Intent 是一个广播接收器,用于锁定手机,然后启动 activity2。此 Activity 与上述第二个 Activity 相同。但是,当此 Activity 从 broadcastreceiver 启动时,没有从 sharedpreferences 加载任何 TextView 。这仅在从 broadcastreceiver 启动 activity2 时发生。

SharedPreference 在 Activity 一中设置为

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

在activity2中以同样的方式访问

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

然后我可以获取字符串等

当 activity2 从 broadcastreceiver 启动时,没有加载任何 sharedprefs。

broadcastreceiver 在不同的包名中,我将它移动到与测试 Activity 相同的包中,但没有任何区别。

这让我发疯,请帮忙!谢谢

编辑

我有一个 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 ,就会正确读取共享首选项。但是,当首先尝试从广播接收器访问时,它不起作用。

这是一个测试Receiver:

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 或其他什么。

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

最佳答案

除了什么Adb El-Rahman saidSharedPreferences 是根据您使用的 context 从 XML 文件中加载的。

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

然而,根据@CommonsWare's answer to another question ,您应该能够通过在 BroadcastReceiver 中调用 context.getApplicationContext() 使其工作。


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

关于android - 从广播接收器启动 Activity 时无法访问共享首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22115077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com