为什么字符串值从 activity 传递到广播接收器时为空?

Why is the string value null when passed from activity to broadcast receiver?

我正在将一个值从 activity 传递给广播接收器:

我的activity代码:

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

这是我的清单:

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

如您所见,key 在这两种情况下都是相同的,当从 activity 传递时,我的广播接收器中的值仍然返回 null。我 运行 不知道如何将值从 activity 传递给广播接收器。请帮助我。

我只想检查我的广播接收器 (String message = sb.toString();) 收到的消息是否等于从 activity (stringBuilder) 发送的消息。

Why am I receiving an empty toast?

您的 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 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_RECEIVED"Intent 进行调用。此广播 Intent 由 Android 框架发送,不会包含您的“额外内容”。

您还有一个 Activity 正在向您的 BroadcastReceiver 发送广播 Intent。在这种情况下,Intent 包含您的“extras”但没有 ACTION,因此它不会进入您的 if 块。