Broadcast receiver in chunk

I have a Broadcast receiver in my snippet to keep track of all received SMS.

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);
}

      

and the permissions in the manifest:

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

      

The problem is, I never get the log. Log.e("smsBroadcastReceiver", "onReceive");

I definitely get an SMS while the receiver is still registered.

However, if I write the receiver as a separate class and put it in the manifest then onReceive () is called.

Did I miss something?

+3


source to share


1 answer


Did I miss something?

Ya you are missing one point of the object's life. When you register a broadcast receiver with a fragment, the target object will remain active until the fragment exists. When the fragment is destroyed, the receiver is also unregistered. So when the snippet is live then you will receive the broadcast, otherwise it won't work. To receive the broadcast when the application is not in the foreground, you need to register the broadcast in the manifest file.

UPDATE

try it

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");
        }
    };

      



And register your receiver as

getActivity().registerReceiver(smsBroadcastReceiver, filter);

      

and unregister like

getActivity().unregisterReceiver(smsBroadcastReceiver);

      

+7


source







All Articles