阅读文档,看起来 BroadcastReceiver 是在不同的进程上执行的,虽然我不是 100% 确定 (BroadcastReceiver lifecycle)
当前正在执行 BroadcastReceiver(即当前正在运行其 onReceive(Context, Intent) 方法中的代码)的进程被认为是前台进程
也就是说,我认为从 onReceive 访问活动是不安全的,因为它是一个不同的进程,它可能会崩溃。
考虑到 Activity 也可以充当广播接收器,但您必须控制它在其生命周期中何时主动侦听事件。这样就可以订阅onResume(代码摘自ZXing项目)
public void onResume(){
activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
[...]
}
public void onPause() {
[...]
activity.unregisterReceiver(powerStatusReceiver);
}
您将 BroadcastReceiver 定义为公共类中的私有类
final class InactivityTimer {
[onResume, onPause, rest of the stuff ...]
private final class PowerStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
// 0 indicates that we're on battery
// In Android 2.0+, use BatteryManager.EXTRA_PLUGGED
int batteryPlugged = intent.getIntExtra("plugged", -1);
if (batteryPlugged > 0) {
InactivityTimer.this.cancel();
}
}
}
}
}
因此,BroadcastReceiver 应该始终保持新标记(通过服务,而不是在 onReceive 内)并且它应该通知潜在活动的 MapActivity 已经添加了新标记,如果它处于活动状态。
或者,更简单的是,Activity 和 BroadcastReceiver 监听相同的 SMS Intent。虽然后者保持它,但第一个更新地图,我只是在猜测我会尝试什么。