我正在尝试将原始数据从扩展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
,则代码不会产生错误。
感谢您的帮助,谢谢。
答案 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
....
});