阅读文档,看起来广播接收器在不同的进程中执行,但我不能百分之百确定( BroadcastReceiver 生命周期)
当前正在执行BroadcastReceiver(即当前正在运行其onReceive(Context, Intent)方法的代码)的进程被认为是前台进程
话虽如此,我认为从onReceive访问Activity并不安全,因为它是一个不同的进程,很可能会崩溃。
请注意,Activity也可以充当BroadcastReceiver,但您必须控制其生命周期何时主动监听事件。这样,您可以在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())) {
int batteryPlugged = intent.getIntExtra("plugged", -1);
if (batteryPlugged > 0) {
InactivityTimer.this.cancel();
}
}
}
}
}
因此,BroadcastReceiver 应始终通过 Service 持久化新标记(永不在 onReceive 内部),并且应通知潜在的活动 MapActivity 已添加新标记,如果它处于活动状态,则会监听。或者,更简单的是,Activity 和 BroadcastReceiver 监听相同的 SMS Intent。虽然后者持久化它,但前者更新地图,我只是猜测我会尝试什么。