6

アプリケーションのさまざまな場所に配置できるカスタムビューを作成しました。ビュー内でBroadcastReceiverを使用して、アプリケーションの他の部分からメッセージを取得することは避けられません。

推奨されていないことを読みましたが(自分のビューのどこでReceiverの登録を解除する必要がありますか?)、使用することを選択した場合、BroadcastManagerからビューの登録を解除する場所はありますか?

4

2 に答える 2

5

LocalBroadcastManagerを使用することをお勧めします。これは、アプリケーション内でのみインテントを表示できるBroadcastReceiverのようなものです。

private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // your code here
    }
};

@Override
protected void onPause() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
    super.onPause();
}

@Override
protected void onResume() {
    LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
    IntentFilter filter = new IntentFilter();
    filter.addAction(MyClass.MY_ACTION);
    lbm.registerReceiver(receiver, filter);
    super.onResume();
}
于 2013-04-09T14:05:10.127 に答える
0

@vggonzが言ったように、ビューにはアクティビティのような明確なライフサイクルがありませんが、ブロードキャストレシーバーをonAttachedToWindow()登録して登録を解除するとonDetachedFromWindow()、期待どおりに機能します。

public class MyView extends View {

    private BroadcastReceiver receiver;

    public MyView(Context context) {
        super(context);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        IntentFilter filter = new IntentFilter();
        filter.addAction("SOME_ACTION");
        filter.addAction("SOME_OTHER_ACTION");
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //do something based on the intent's action
            }
        };
        getContext().registerReceiver(receiver, filter);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (receiver != null) {
            getContext().unregisterReceiver(receiver);
            receiver = null;
        }
    }
}
于 2020-11-15T15:22:47.490 に答える