简体   繁体   中英

Send data from IntentService to BroadcastReceiver

I am trying to send primitive data from a class extending IntentService to a class extending a BroadcastReceiver , however, data received in the BroadcastReceiver is null .

In my IntentService class, I have the following code

 Intent smsListener = new Intent(ScheduledRepliesService.this, SmsListener.class);
 smsListener.putExtra("reply", reply);
 smsListener.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startService(smsListener);

I can guarantee that reply is not null in IntentService class.

I retrieve it in onReceive method in BroadcastReceiver class with

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
        String replyMessage = intent.getStringExtra("reply");
        ...
    }
    ...
}

I have declared the receiver in Manifest.xml file

<receiver android:name=".utilities.sms.SmsListener">
   <intent-filter>
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
   </intent-filter>
</receiver>

and can confirm that if replyMessage string is not null , code produces no errors.

I would appreciate your help, thank you.

Although I was not able to find an answer to my problem, I did a bit of a workaround, and it does solve my problem. I hope this answer will be useful for somebody else as well.

I have a foreground service responsible for creating notifications when SMS message is received and a broadcast receiver whose task is to return said message body and sender number.

I was thinking in the wrong direction, sending data from service to receiver, but it should be the other way around.

Create an interface

public interface SmsListener {
    public void messageReceived(String messageSender, String messageText);
}

and use this code in broadcast receiver

public class SmsBroadcastReceiver extends BroadcastReceiver {

    //Interface
    private static SmsListener smsListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        //Get data to a Bundle
        Bundle data = intent.getExtras();

        //PDUs represent received SMS message(s)
        assert data != null;
        Object[] pdus = (Object[]) data.get("pdus");

        for (int i = 0; i < pdus.length; i++) {
            //Reconstruct SMS message from pdus object
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
            String sender = smsMessage.getDisplayOriginatingAddress();
            String messageBody = smsMessage.getDisplayMessageBody();

            //SmsListener's callback method
            smsListener.messageReceived(sender, messageBody);
        }
    }

    //Bind listener for the use in ScheduledRepliesService
    public static void bindListener(SmsListener listener) { smsListener = listener; }
}

and lastly, retrieve the SMS message contents and sender number (as string) in service

//Get SMS message data from SmsBroadcastReceiver
SmsBroadcastReceiver.bindListener(new SmsListener() {
    @Override
    public void messageReceived(String messageSender, String messageText) {
        //TODO: do something in here
        ....
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM