【问题标题】:Android SharedPreferences value not update in BroadcastReceiverAndroid SharedPreferences 值未在 BroadcastReceiver 中更新
【发布时间】: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


【解决方案1】:

这是由于 manifests.xml 中的 android:process=":remote" 删除后造成的。我得到了正确的布尔值。

【讨论】:

  • 只是想知道,提及“:remote”对 SharedPreferences 的保存行为有何影响?
  • google 之后,我认为它与 w/ :remote = 工作线程和 w/o = UI 线程有关。
  • 谢谢!这完全有道理,因为 SharedPreferences 只能通过 UI 线程更新。但是,在 UI 以外的线程中,我预计应用程序会崩溃。
  • 崩溃会更好。不幸的是,非 UI 线程上什么也没发生。这可能会导致调试工作更加复杂。
【解决方案2】:

替换-

editorALARM.putBoolean("alarm", true).apply();

与-

editorALARM.putBoolean("alarm", true).commit();

对你有用

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多