[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
2022-07-20 12:30:43
質問
2つの異なるブロードキャストをキャッチする必要があるAndroidアクティビティがあります。私の現在のアプローチは、1つの
BroadcastReceiver
を作り、それで両方のブロードキャストをキャッチすることです。
public class MyActivity extends Activity {
private MyActivity.BroadcastListener mBroadcastListener;
private boolean mIsActivityPaused = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
// Create the broadcast listener and register the filters
mIsActivityPaused = false;
mBroadcastListener = new BroadcastListener();
IntentFilter filter = new IntentFilter();
filter.addAction(Params.INTENT_REFRESH);
filter.addAction(Params.INTENT_UPDATE);
registerReceiver(mBroadcastListener, filter);
}
@Override
protected void onResume() {
super.onResume();
mIsActivityPaused = false;
}
@Override
protected void onPause() {
super.onPause();
mIsActivityPaused = true;
}
@Override
protected void onDestroy() {
unregisterReceiver(mBroadcastListener);
super.onDestroy();
}
private void refresh() {
// refresh
}
private void update() {
// update
}
private class BroadcastListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Params.INTENT_REFRESH && !mIsActivityPaused)) {
refresh();
} else if (intent.getAction().equals(Params.INTENT_UPDATE)) {
update();
}
}
}
}
を実行したい。
refresh()
を実行したいのですが、Activityが画面上に表示されているときに
INTENT_UPDATE
をキャッチして
update()
を実行し、Activityが表示されているか否かに関わらず、Activityの全期間において
で登録した2つのフィルタのうち、片方だけ登録を解除する方法は見つかりませんでした。
onCreate
に登録した2つのフィルタのうち1つだけを解除する方法が見つからなかったので、フラグを使用しています。
INTENT_REFRESH
ブロードキャストがキャッチされたときに実行されるアクションを、Activityの状態に応じて有効または無効にするフラグを使用しています。
質問は : これは正しいアプローチなのでしょうか?
それとも、以下のように2つのBroadcastReceiverを別々に用意した方が良いのでしょうか?
public class MyActivity extends Activity {
private MyActivity.BroadcastListenerRefresh mBroadcastListenerRefresh;
private MyActivity.BroadcastListenerUpdate mBroadcastListenerUpdate;
private boolean mIsBroadcastListenerRefreshRegistered = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create the broadcast listeners
mBroadcastListenerRefresh = new BroadcastListenerRefresh();
mBroadcastListenerUpdate = new BroadcastListenerUpdate();
registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH));
registerReceiver(mBroadcastListenerUpdate, new IntentFilter(Params.INTENT_UPDATE));
}
@Override
protected void onResume() {
super.onResume();
if (mBroadcastListenerRefresh != null && !mIsBroadcastListenerRefreshRegistered) {
registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH));
mIsBroadcastListenerRefreshRegistered = true;
}
}
@Override
protected void onPause() {
super.onPause();
if (mBroadcastListenerRefresh != null && mIsBroadcastListenerRefreshRegistered) {
unregisterReceiver(mBroadcastListenerRefresh);
mIsBroadcastListenerRefreshRegistered = false;
}
}
@Override
protected void onDestroy() {
unregisterReceiver(mBroadcastListenerRefresh);
unregisterReceiver(mBroadcastListenerUpdate);
super.onDestroy();
}
private void refresh() {
// refresh
}
private void update() {
// update
}
private class BroadcastListenerRefresh extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Params.INTENT_REFRESH)) {
refresh();
}
}
}
private class BroadcastListenerUpdate extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Params.INTENT_UPDATE)) {
update();
}
}
}
}
で、どっちが性能いいんだ?
どのように解決するのですか?
の代わりに、2つの異なるインテント・フィルタを提供することができます。
リフレッシュのためのみのフィルタ
IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH);
更新と更新のためのフィルタ
IntentFilter filterRefreshUpdate = new IntentFilter();
filterRefreshUpdate.addAction(Params.INTENT_REFRESH);
filterRefreshUpdate.addAction(Params.INTENT_UPDATE);
これで、インテント・フィルタを登録・解除して切り替えても、受信機の実装は同じになります。
関連
-
[解決済み] ViewPagerのアイテムを強制的に再インスタンス化する方法 [重複].
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] WhatsAppでメッセージを送信する
-
[解決済み] 文字列からJSONオブジェクトへの変換 Android
-
[解決済み] メディアプレーヤーが状態0で呼び出され、エラー(-38,0)
-
[解決済み] エラー Android Studioで名前'default'を持つ構成が見つかりません。
-
[解決済み] アンドロイドでビットマップのサイズを変更する最もメモリ効率の良い方法とは?
-
[解決済み] Android Studioからプロジェクトを削除する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
-
[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] WhatsAppでメッセージを送信する
-
[解決済み] 開発者コンソールでのベータ版/アルファ版テストについての説明が必要です。
-
[解決済み] アンドロイドでビットマップのサイズを変更する最もメモリ効率の良い方法とは?
-
[解決済み] OnScreen KeyboardのDoneキー押下を検出するAndroid
-
[解決済み] Android Studioで複数のデバイスでアプリを自動実行する