Java 如何注销片段中使用的接收器?

Java 如何注销片段中使用的接收器?,java,android,broadcastreceiver,Java,Android,Broadcastreceiver,我在FragmentInfo类中实现了onReceive方法,因为当意图从代码中的其他地方发送时,我需要更新UI。我从Fragment注册此接收器,但从MainActivity注册,因为它必须从Activity注册。我不知道在哪里放置未注册的接收器呼叫,所以我的程序崩溃了。我得到一个错误: MainActivity泄漏了最初在此处注册的IntentReceiver FragmentInfo。您是否错过了对unregisterReceiver()的调用? 我试图从MainActivity onPa

我在FragmentInfo类中实现了onReceive方法,因为当意图从代码中的其他地方发送时,我需要更新UI。我从Fragment注册此接收器,但从MainActivity注册,因为它必须从Activity注册。我不知道在哪里放置未注册的接收器呼叫,所以我的程序崩溃了。我得到一个错误:

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后注销了receiver,它现在可以工作了。我在代码中编辑。

您将从片段中的
onPause
方法调用
unregisterReceiver

好的做法是在onResume中注册广播接收器,并在onPause中注销。因此,每当用户看到片段时,它就会注册接收者;每当片段不可见时(被另一个片段删除或替换),它就会注销接收者。

尝试通过以下方法调用
注销接收者

@Override
public void onDestroyView() {
    super.onDestroyView();
}

我最终通过以下方式解决了泄漏问题:

LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(YOUR_RECEIVER_HERE);
因为这样做

getActivity().unregisterReceiver(...) 


onPause()
onStop()
中都没有帮助。

使用unregisterReceiver(broadcastReceiver)?您可以在onDestroy()-1中执行此操作,因为这是错误的。一旦你的片段得到了
onPause()
,那么接收者就消失了,永远不会重新注册。我不能,因为接收者还没有注册,所以程序崩溃了。我找到了解决办法,而且似乎有效。在调用updateUIInfo之后,我在onReceive方法中注销了它。您可以设置一个布尔变量来确定它是否已注册。您可以使用if(is_registed)getActivity.unregisterReceiver(broadcastReceiver);你把LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(你的接收器)放在哪里了;在你的片段中?因为它是未注册的部分,可能在onPause()中。。。是很久以前的事了,我想不起来了。
getContext().unregisterReceiver(...)