片段中的广播接收器

Broadcast receiver in a Fragment

我的 Fragment 中有一个广播接收器,用于跟踪任何新收到的短信。

private BroadcastReceiver smsBroadcastReceiver;
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    smsBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("smsBroadcastReceiver", "onReceive");
        }
    };
}

@Override
public void onStart() {
super.onStart();
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(smsBroadcastReceiver, filter);
}

@Override
public void onStop() {
    super.onStop();
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(smsBroadcastReceiver);
}

以及清单中的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

问题是我从来没有得到日志Log.e("smsBroadcastReceiver", "onReceive"); 我肯定在收件人还在注册的时候收到了短信。

但是,如果我将接收器写成一个单独的 class 并将其放入清单中,则会调用它的 onReceive()。

我是不是漏掉了什么?

我是不是漏掉了什么?

是的..你错过了反对寿命的一点。当您在片段中注册广播接收器时,接收器对象将一直存在,直到片段存在。当片段被销毁时,接收者也被取消注册。因此,只要片段处于活动状态,那么只有您会收到广播,否则它将无法工作。要在应用程序不在前台时接收广播,您必须在清单文件中注册广播。

更新

这样试试

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
private BroadcastReceiver smsBroadcastReceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("smsBroadcastReceiver", "onReceive");
        }
    };

然后像

一样注册你的接收器
getActivity().registerReceiver(smsBroadcastReceiver, filter);

并像

一样注销
getActivity().unregisterReceiver(smsBroadcastReceiver);