(与我刚刚发布的另一个问题略有不同,如果这违反了规则,请道歉)
在我的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)通过在应用程序中创建一个包含文件名的ActivitiesSharedPReference来使用相同的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();

10-07 23:43