访问扩展BroadcastReceiver的类中的SharedPreference

时间:2017-02-02 03:02:03

标签: android android-studio

我正在尝试从将BroadcastReceiver扩展到自定义SaveSharedPreferences类的类(SMSSendingWeb)调用我的方法(saveSharedpreferences.setCountReceived)。

我的问题是它无法保存到SharedPreferences中没有任何反应。 我很困惑我的代码问题在哪里。

  1. 此方法中的参数在

    时出错

    saveSharedpreferences.setCountReceived(SMSSendingWeb.this,countReceived);

  2. 我将其更改为上下文也有错误

    saveSharedpreferences.setCountReceived(context,countReceived);

  3. 这是我的代码:请查看setCountReceived()

    public class SaveSharedPreferences {
    
        static final String PREF_USER_NAME= "username";
        static final String PREF_COUNT_RECEIVED= "received";
    
        static SharedPreferences getSharedPreferences(Context ctx) {
            return PreferenceManager.getDefaultSharedPreferences(ctx);
        }
    
    
        //==========================================================
        public static void setCountReceived(Context ctx, Integer countReceived)
        {
            SharedPreferences.Editor editor = getSharedPreferences(ctx).edit();
            editor.putInt(PREF_COUNT_RECEIVED, countReceived);
            editor.commit();
        }
    
    }
    Android code:
    
    public class SMSSendingWeb extends BroadcastReceiver {
    
        RestService restService;
    
        public static Integer countReceived = 0;
    
        SaveSharedPreferences saveSharedpreferences;
    
        @Override
        public void onReceive(Context context, Intent intent) { //for Receiving
    
            restService = new RestService();
    
            saveSharedpreferences = new SaveSharedPreferences();
    
            Bundle b = intent.getExtras();
            Object[] pduObj= (Object[]) b.get("pdus");
            String mobileno = null;
            String message = null;
            String data = null;
    
            for(int i=0;i<pduObj.length;i++){
    
                SmsMessage smsMessage=SmsMessage.createFromPdu((byte[]) pduObj[i]);
                //get the sender number
                mobileno=smsMessage.getOriginatingAddress();
                //get the sender message
                message=smsMessage.getMessageBody();
    
                data="From : "+mobileno+"\n Message : "+message;
            }
    
    
            SMSInbox sms = new SMSInbox();
            sms.MobileNo = mobileno;
            sms.Message = message;
    
            restService.getService().addSMS(sms, new Callback<String>() {
                @Override
                public void success(String s, Response response) {
                    //Toast.makeText(, "Successfully added", Toast.LENGTH_LONG).show();
                    countReceived += 1;
    
                    saveSharedpreferences.setCountReceived(SMSSendingWeb.this, countReceived);
    
                    Log.d("API inside restService", "count: " + countReceived);
    
                }
    
                @Override
                public void failure(RetrofitError error) {
                    //Toast.makeText(MainActivity.this, error.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            });
            countReceived += 1;
    
            Log.d("API outside restService", "count: " + countReceived);
            saveSharedpreferences.setCountReceived(context, countReceived);
    
    
        }

1 个答案:

答案 0 :(得分:2)

您正在尝试访问首选项而不是共享首选项,两者之间存在细微差别。从this answer

开始
  

Preferences是一种用于存储和检索的Android轻量级机制   成对的原始数据类型(也称为地图和关联   阵列)。

     

在表单的每个条目中,键是一个字符串,值必须是a   原始数据类型。

     

当我们需要他们时:

     

首选项通常用于保存状态信息和共享   应用程序的几个活动之间的数据。

     

共享首选项是Android中可用于存储的存储   存储一些与功能,用户相关的基本内容。定制   或其个人资料。

     

假设您要在应用中保存用户名,以备将来使用。   你不能在数据库中保存这么小的东西,所以你最好保留它   保存在您的首选项中。首选项就像一个文件,来自   您可以在应用程序的生命周期中随时检索值   KEY-VALUE对方式。

     

再举一个例子,如果你使用whatsapp,我们有一个壁纸选项   那里。应用程序如何知道哪个图像用作墙纸   你什么时候打开你的whatsapp。此信息存储在   喜好。每当您清除任何应用程序的数据时,首选项都是   删除

您正在使用偏好设置并尝试在共享首选项中写入值,因此我只是将您的代码更改为使用共享首选项。

用于保存偏好

 public static void setCountReceived(Context ctx, Integer countReceived)
    {
        SharedPreferences.Editor editor = getSharedPreferences(YOUR_PREF_NAME,MODE_PRIVATE).edit();
        editor.putInt(PREF_COUNT_RECEIVED, countReceived);
        editor.commit();
    }

用于检索首选项,

static SharedPreferences getSharedPreferences(Context ctx) {
        return context.getSharedPreferences(YOUR_PREF_NAME,MODE_PRIVATE);
    }