【发布时间】:2016-08-26 13:31:16
【问题描述】:
我创建了一个名为 ALARM 的 SharedPreferences,其中包含一个名为 ("alarm",boolean) 的映射,("alarm",boolean) 的布尔值在 MainActivity 中不时更改,并在 BroadcastReceiver 中接收。
问题是:当我不时更改 MainActivity 中的值时,BroadcastReceiver 只更改一次。我的代码有什么问题?
在下面的代码中,start() 与按钮对齐,单击时将布尔值更改为 true。我也可以看到在 BroadcastReceiver 中收到的真实值。但随后我点击 stop(),在 MainActivity 中将布尔值更改为 false,但在 BroadcastReceiver 中仍然看到接收到的真实值。
如果我先点击 stop(),那么我总是在 BroadcastReceiver 中看到 false 值。(即使我多次点击 start())
谢谢。
主活动:
public class MainActivity extends AppCompatActivity {
SharedPreferences ALARM;
SharedPreferences.Editor editorALARM;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ALARM = getSharedPreferences("ALARM", MODE_PRIVATE);
editorALARM = ALARM.edit();
}
// start data service
public void start(View view) {
editorALARM.putBoolean("alarm", true).apply();
Log.e("start",""+ALARM.getBoolean("alarm", false));
Intent intent = new Intent();
intent.setAction("xxx.ALARM");
sendBroadcast(intent);
}
// stop data service
public void stop(View view) {
editorALARM.putBoolean("alarm", false).apply();
Log.e("stop",""+ALARM.getBoolean("alarm", true));
Intent intent = new Intent();
intent.setAction("xxx.ALARM");
sendBroadcast(intent);
}
}
广播接收者:
public class Receiver extends BroadcastReceiver {
SharedPreferences ALARM;
@Override
public void onReceive(Context context, Intent intent) {
ALARM = context.getSharedPreferences("ALARM", Activity.MODE_PRIVATE);
Log.e("actual",""+ALARM.getBoolean("alarm", false));
}
}
【问题讨论】:
-
apply() 以异步方式工作,请尝试 commit() 代替
标签: android sharedpreferences android-broadcastreceiver