(与我刚刚发布的另一个问题略有不同,如果这违反规则则道歉)
在我的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
或其他任何内容。
我不明白为什么它的广播接收器失败了,是不是同一个背景?
答案 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();