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)