Android监听短信

在Android开发中,我们经常需要监听短信的到达,以便进行相关的业务处理。本文将介绍如何在Android应用程序中监听短信的到达,并提供相关的代码示例。

监听短信的到达

要监听短信的到达,我们需要使用一个BroadcastReceiver来接收短信到达的系统广播。Android系统会在每次收到新短信时发送一条"android.provider.Telephony.SMS_RECEIVED"的广播。我们可以注册一个BroadcastReceiver来接收这个广播,并在接收到广播时进行相应的处理。

首先,我们需要在AndroidManifest.xml文件中注册我们的BroadcastReceiver。在<application>标签内添加如下代码:

<receiver
    android:name=".SmsReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

这样,当有新短信到达时,系统会发送"android.provider.Telephony.SMS_RECEIVED"的广播,并将广播交给我们的SmsReceiver处理。

接下来,我们需要创建一个继承自BroadcastReceiver的类SmsReceiver,并重写onReceive方法来处理短信到达的逻辑。

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里处理短信到达的逻辑
    }
}

在onReceive方法中,我们可以通过intent获取到短信的相关信息,例如发送方号码、短信内容等。我们可以根据这些信息来进行相应的处理,例如提取验证码、过滤垃圾短信等。

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null) {
                    for (Object pdu : pdus) {
                        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                        String sender = smsMessage.getDisplayOriginatingAddress();
                        String message = smsMessage.getDisplayMessageBody();
                        // 在这里处理短信的相关逻辑
                    }
                }
            }
        }
    }
}

示例应用

为了更好地理解如何监听短信的到达,我们可以创建一个简单的示例应用。这个应用在收到验证码短信后会将短信内容展示在界面上。

首先,我们需要在布局文件中添加一个TextView来展示短信内容。在activity_main.xml中添加如下代码:

<TextView
    android:id="@+id/messageTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

接下来,我们创建一个MainActivity,并在onCreate方法中注册我们的BroadcastReceiver。

public class MainActivity extends AppCompatActivity {
    private TextView messageTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        messageTextView = findViewById(R.id.messageTextView);

        // 注册BroadcastReceiver
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(new SmsReceiver(), filter);
    }
}

最后,我们在SmsReceiver的onReceive方法中更新TextView的内容。

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null) {
                    for (Object pdu : pdus) {
                        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                        String sender = smsMessage.getDisplayOriginatingAddress();
                        String message = smsMessage.getDisplayMessageBody();
                        // 更新TextView的内容
                        ((MainActivity)context).messageTextView.setText(message);
                    }
                }
            }
        }
    }
}

现在,当收到验证码短信时,应用会将短信内容展示在界面上。

类图

以下是本文所使用的类的类图:

classDiagram
    class SmsReceiver {
        +onReceive(Context, Intent)