アプリケーションのさまざまな場所に配置できるカスタムビューを作成しました。ビュー内でBroadcastReceiverを使用して、アプリケーションの他の部分からメッセージを取得することは避けられません。
推奨されていないことを読みましたが(自分のビューのどこでReceiverの登録を解除する必要がありますか?)、使用することを選択した場合、BroadcastManagerからビューの登録を解除する場所はありますか?
アプリケーションのさまざまな場所に配置できるカスタムビューを作成しました。ビュー内でBroadcastReceiverを使用して、アプリケーションの他の部分からメッセージを取得することは避けられません。
推奨されていないことを読みましたが(自分のビューのどこでReceiverの登録を解除する必要がありますか?)、使用することを選択した場合、BroadcastManagerからビューの登録を解除する場所はありますか?
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();
}
@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;
}
}
}