(与我刚刚发布的另一个问题略有不同,如果这违反了规则,请道歉)
在我的activity1中,我正在设置一些共享的首选项,接下来,我通过一个意图启动另一个activity2,并在sharedpreferences
中设置一些文本视图。一切正常。
这是我的问题。
在我的第一个activity1中,我有一个带有挂起意图的alarmmanger
,这个挂起意图是一个用来锁定电话的广播接收器,然后启动activity2。此活动与上述第二个活动相同。但是,从broadcastreceiver
启动此活动时,没有从sharedpreferences
加载任何文本视图。只有从broadcastreceiver
启动activity2时才会发生这种情况。SharedPreference
在活动1中设置为
SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE);
在活动2中以相同的方式访问
SharedPreferences lockPreferences = getSharedPreferences("lockprefs", Context.MODE_PRIVATE);
然后我可以得到字符串等
从BroadcastReceiver启动Activity2时,未加载任何SharedPref。
broadcastreceiver
在不同的包名中,我将它移到与测试活动相同的包中,但没有区别。它把我逼疯了,请帮帮我!
谢谢
编辑
我有一个gcminentservice,这是我设置共享prefs的地方(基于从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", "");
然后我可以做一个
toast
或其他什么。我不明白为什么广播接收器会失败,是不是上下文不一样??
最佳答案
首先,你应该知道你用SharedPreference
方法创建的getSharedPreference
文件在你的应用程序目录中被表示为一个真正的XML
文件,所以如果你已经添加了你的值并提交了你的修改,那么你所有的编辑都应该存在。
其次,项目中有一个BroadcastReceiver
类应该与项目中的PackageName
类相同,即使它是在关闭应用程序时启动的。
现在你要确保的是:
1)通过在应用程序中创建一个包含文件名的Activities
SharedPReference
来使用相同的public
文件。
public final static String PREFERENCE_NAME = "com.example.mypackage.preference"
2)两个
constant
都使用与下面相同的Activities
文件SharedPreferences lockPreferences = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
3)确保在其他文件尝试读取之前提交您的编辑。
lockPreferences.putBoolean(CONSTANT_KEY, true);
commit();