将数据从IntentService发送到BroadcastReceiver

时间:2019-02-15 17:47:43

标签: java android

我正在尝试将原始数据从扩展IntentService的类发送到扩展BroadcastReceiver的类,但是,在BroadcastReceiver中接收的数据是null

在我的IntentService类中,我有以下代码

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

我可以保证reply类中的IntentService不为空。

我在onReceive类的BroadcastReceiver方法中使用

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

我已经在Manifest.xml文件中声明了接收者

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

并可以确认如果replyMessage字符串不是null,则代码不会产生错误。

感谢您的帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

尽管我无法找到问题的答案,但我做了一些变通方法,它确实解决了我的问题。我希望这个答案对其他人也有用。

我有一个前台服务,负责在收到SMS消息时创建通知;还有一个广播接收器,其任务是返回所述消息正文和发件人编号。

我想的方向错了,将数据从服务发送到接收器,但这应该是相反的方式。

创建界面

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

并在广播接收器中使用此代码

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

最后,检索服务中的SMS消息内容和发件人编号(作为字符串)

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