广播接收器无法读取共享首选项中的当前值

时间:2017-02-07 11:18:23

标签: android broadcastreceiver sharedpreferences

我有一个带有编辑文本首选项的设置活动,它在共享首选项中保存一个IP地址字符串,然后我有一个广播接收器,其中AsyncTask调用服务。我想制作可自定义的url地址,但是当我调用时没有采用ip地址的当前值,但是当我重新启动我的应用程序时采取了正确的值。我怎么能解决这个问题。我只粘贴有用的代码。 提前致谢

public class Broadcast extends BroadcastReceiver {


@Override
public void onReceive(final Context context, Intent intent) {

    preferences = PreferenceManager.getDefaultSharedPreferences(context);

        new Call().execute();

}



private class Call extends AsyncTask<String, String, String> {

    String ip;

    @Override
    protected String doInBackground(String... params) {

            ip = preferences.getString("key","");


        String result = RestFullConnection.postCall("http://" + ip + ":8080/app/api/bla/sync", params[0]);
        return result;

    }

}

+++ edit +++ 我在MainActivity中调用broadcast,然后使用EditTextPreference:

将值保存在SP中
    Intent alarmIntent = new Intent(getApplicationContext(), Broadcast.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 5000, 30 * 1000, pendingIntent);

2 个答案:

答案 0 :(得分:0)

请在onReceive

中试试
preferenze = context.getSharedPreferences(PERFERENCE_NAME,
            Context.MODE_PRIVATE);

希望它会帮助你。

答案 1 :(得分:0)

这取决于您保存SharedPreferences的方式。使用apply()方法将异步存储该值,因此它不会阻止当前的Thread。另一方面,commit()会立即保存该值。这个可能您的案例中的问题(请在保存SharedPreferences的地方提供您的代码)。

请注意,SharedPreferences在不同的进程中无法正常工作!如果您使用不同的流程,我建议使用一些与之相关的机制(例如IPC,数据库,......)。

替换SharedPreferences的替代库是Tray。它使用Content Provider / Databases并具有类似的语法。您甚至可以从SharedPreferences导入现有数据。