Android 为什么从活动传递到广播接收器时字符串值为空?
我正在将值从活动传递到广播接收器: 我的活动代码:Android 为什么从活动传递到广播接收器时字符串值为空?,android,android-intent,Android,Android Intent,我正在将值从活动传递到广播接收器: 我的活动代码: String stringBuilder = "Hello"; String phone_no = "1234567890"; try{ SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phone_no, null, stringBuilder, null, null); Intent broa
String stringBuilder = "Hello";
String phone_no = "1234567890";
try{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phone_no, null, stringBuilder, null, null);
Intent broadcastIntent = new Intent(contacts.this, Receiver.class);
broadcastIntent.putExtra("message",stringBuilder);
sendBroadcast(broadcastIntent);
}catch (Exception e) {
e.printStackTrace();
}
我的广播接收器代码:
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//String msg= intent.getStringExtra("message") //returns null
Bundle bundle = intent.getExtras();
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
String msg= intent.getStringExtra("message") //returns null
if (bundle != null){
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0) {
return;
}
// large message might be broken into many
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
if (message.equals(msg)) {
//do something
}
}
Toast.makeText(context,message,Toast.LENGTH_SHORT).show(); //empty toast
}
}
公共类接收器扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
//String msg=intent.getStringExtra(“消息”)//返回null
Bundle=intent.getExtras();
if(intent.getAction().equals(“android.provider.Telephony.SMS_RECEIVED”)){
String msg=intent.getStringExtra(“消息”)//返回null
if(bundle!=null){
Object[]pdus=(Object[])bundle.get(“pdus”);
如果(pdus.length==0){
返回;
}
//大消息可能会被分成多个部分
SmsMessage[]messages=新SmsMessage[pdus.length];
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
这是我的舱单:
<receiver
android:name=".Receiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
正如您所看到的,键在这两种情况下都是相同的,当从活动中传递时,值在我的广播接收器中仍然返回null。关于如何将值从活动传递到广播接收器,我已经没有主意了。请帮助我
我只想检查广播接收器中接收到的消息(String message=sb.toString();
)是否与活动中发送的消息相同(stringBuilder
)
为什么我收到的是空的祝酒词
您的stringBuilder
变量(您的代码中没有包含该变量)为空。好吧,再看一次您的代码,我注意到一条可疑的线可能会导致问题
broadcastIntent.putExtra("message",stringBuilder);
你的意思是,像这样使用它:
broadcastIntent.putExtra(android.content.Intent.EXTRA_TEXT,stringBuilder);
然后您可以通过以下方式获得:
intent.getStringExtra(android.content.Intent.EXTRA_TEXT);
或者,如果要发送多个内容:
broadcastIntent.putExtra(android.content.Intent.EXTRA_TEXT, new String[] { stringBuilder, phone_no } );
要获得它们:
String[] str = intent.getStringArrayExtra(android.content.Intent.EXTRA_TEXT);
String message = str[0];
String phone_no = str[1];
或者您也可以使用捆绑包
Bundle bundle = new Bundle();
bundle.putCharSequence("message", stringBuilder);
bundle.putCharSequence("phone_no", phone_no);
broadcastIntent.putExtras(bundle);
稍后,您可以使用以下方法检索它们:
public class Receiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
{
//String message= intent.getStringExtra("message") //returns null
Bundle bundle = intent.getExtras();
if(bundle != null) {
String message = bundle.getString("message");
Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,"Bundle is null",Toast.LENGTH_SHORT).show();
}
}
}
}
您似乎混淆了两件不同的事情。您在清单中注册了您的BroadcastReceiver
,将由传入的SMS触发。发生这种情况时,您的BroadcastReceiver.onReceive()
将被调用,其中包含ACTION=“android.provider.Telephony.SMS\u RECEIVED”
。此广播Intent
由Android框架发送,不包含您的“附加内容”
您还有一个活动
,它正在向您的广播接收器
发送一个广播意图
。在这种情况下,意图
包含您的“附加内容”但是没有操作,所以它不会输入你的if
块。它不是空的,我在活动中检查了它,但是当我将它传递给broadcast receiver类时,它显示为空。用代码证明它。我编辑了我的代码。你的接收器是否在一个单独的进程中运行,与具有活动广播意图的接收器不同?是的,我创建了我创建了一个单独的广播接收器类。我也在清单中注册了一个不同的类不一定意味着一个单独的进程。你应该确认。如果你的清单是可以依据的,我怀疑它们都在同一个进程中,在这种情况下,意图对于组件间通信来说是一个糟糕的设计初始化。您确定数据是字符串而不仅仅是字符序列吗?您可能正在调用putExtra(字符串名称,字符序列值)
而不是putExtra(字符串名称,字符串值)
。如果是这样,那么getStringExtra()
找不到字符串并将返回null。但是stringBuilder
是一个字符串我也使用Bundle
尝试过,但仍然不起作用。我认为这是android atudioSo中的一个bug。如何在我的broad cast receiver类中获取值?只需移动getStringExtra()
在if
块之外。尝试后,仍然显示为空。请发布您的代码。您的广播接收器是由您的活动触发的还是由传入的SMS触发的?如果是由传入的SMS触发的,它将不包含您的“额外内容”。