ドキュメントを読むと、BroadcastReceiver が別のプロセスで実行されているように見えますが、100% 確実ではありません ( BroadcastReceiver lifecycle )
現在 BroadcastReceiver を実行しているプロセス (つまり、その onReceive(Context, Intent) メソッドで現在コードを実行しているプロセス) は、フォアグラウンド プロセスと見なされます。
これは、別のプロセスであり、おそらくクラッシュするため、onReceive からアクティビティにアクセスするのは安全だとは考えていません。
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())) {
// 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 は常に新しいマーカーを永続化する必要があり (Service を介してonReceive内では決して行わないでください)、アクティブである可能性がある MapActivity に、新しいマーカーが追加されたことを通知する必要があります。
または、さらに簡単に、Activity と BroadcastReceiver が同じ SMS Intent をリッスンします。後者はそれを維持しますが、最初はマップを更新しますが、私が何をしようとしているのかを推測しています。