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触发的,它将不包含您的“额外内容”。