FragmentInfo クラスに onReceive メソッドを実装しました。これは、コード内の別の場所からインテントが送信されたときに UI を更新する必要があるためです。このレシーバーは Fragment から登録しますが、Activity から登録する必要があるため、MainActivity から登録します。unregisterReceiver 呼び出しを配置する場所がわからないため、プログラムがクラッシュします。エラーが発生します:
MainActivity は、元々ここに登録されていた IntentReceiver FragmentInfo をリークしました。unregisterReceiver() への呼び出しがありませんか?
通常行われているように、MainActivity onPause メソッドから unregisterReceiver を呼び出そうとしましたが、MainActivity から mBroadcastReceiver にアクセスできません。どうすればこれを解決できますか?
public class FragmentInfo extends Fragment {
//nested class BroadcastReceiver
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
//from there we must update FragmentInfo UI
@Override
public void onReceive(Context context, Intent intent) {
//updateFragmentInfo(intent);
updateUiInfo();
//unregisterReceiver
((MainActivity)getActivity()).unregisterReceiver(mBroadcastReceiver);
}
};
private TextView textView3;
private TextView textView5;
private TextView textView7;
private TextView textView8;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//dynamic register BroadcastReceiver, for triggering intent when BT connection is established
//BroadcastReceiver can be registered static in ManifestFile
IntentFilter mIntentFilter = new IntentFilter();
//register message
mIntentFilter.addAction("bluetooth_established_intent");
//we must call registerReceiver from MainActivity!
((MainActivity)getActivity()).registerReceiver(this.mBroadcastReceiver,mIntentFilter);
}
}
編集: updateUIInfo を呼び出した後にレシーバーの登録を解除すると、現在は動作します。コードで編集します。