在Android平台上,发送和接收短信是一项常见的功能,主要涉及到`SMSManager`类和`BroadcastReceiver`组件。下面将详细介绍这两个核心知识点。
1. **发送短信**:
- `SMSManager`是Android SDK提供的一个类,它负责处理短信的发送。在发送短信时,通常会使用`sendTextMessage()`方法。该方法接收五个参数:
- `num`:目标手机号码。
- `scAddress`:短信服务中心地址,通常设置为`null`以使用系统默认值。
- `content`:短信内容。
- `pendingIntent`:发送结果的意图,用于回调发送状态,例如成功、失败或取消。
- `sentIntent`:当短信被成功发送到运营商时触发的意图,通常为`null`。
- 在AndroidManifest.xml文件中,必须声明`SEND_SMS`权限,否则应用无法发送短信。添加如下代码:
```xml
<uses-permission android:name="android.permission.SEND_SMS"/>
```
- 注意:在模拟器上测试时可能会遇到中文乱码问题,但在真实设备上通常不会出现这个问题。
2. **接收短信**:
- 使用`BroadcastReceiver`来监听并处理接收到的短信。创建一个继承自`BroadcastReceiver`的类,重写`onReceive()`方法。
- 在`onReceive()`中,通过`Intent`的`getAction()`方法检查是否接收到的是短信,然后解析`Intent`中的`pdus`数据来获取短信内容。
- 示例代码中,`MessageDemo`类展示了如何实现短信接收。在`onReceive()`方法中,遍历`pdus`数组,使用`SmsMessage.createFromPdu()`方法创建`SmsMessage`对象,并从中提取发送者的号码和短信内容。
3. **配置`BroadcastReceiver`**:
- 在AndroidManifest.xml中,需要定义一个`receiver`节点,指定其类名为你的`BroadcastReceiver`子类,例如`MessageDemo`。
- 添加一个`intent-filter`节点,设置`action`属性为`android.provider.Telephony.SMS_RECEIVED`,表示监听短信接收到的广播。
- 同样,还需要声明`RECEIVE_SMS`权限,以便接收短信:
```xml
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
```
4. **BroadcastReceiver的注意事项**:
- `BroadcastReceiver`处理短信接收时,其行为是异步且无序的。这意味着多个`BroadcastReceiver`可能同时接收到短信,且接收顺序无法保证。即使是使用有序广播(Ordered Broadcasts),同级别的接收器也无法保证顺序。
5. **数据库监听短信收发**:
- 除了使用`BroadcastReceiver`,还可以通过监听SMS数据库的变化来监控短信的收发。这通常涉及到创建一个`ContentObserver`或者`SQLiteOpenHelper`的子类,当SMS表有变化时,会触发回调,从而更新UI或其他业务逻辑。
- 示例代码中提到的`SMSHandler`是一个`Handler`类,通常用于在主线程中处理来自数据库观察者的消息,确保UI操作在正确的线程中执行。
Android平台上的短信功能主要涉及`SMSManager`的使用来发送短信,以及`BroadcastReceiver`或数据库监听来接收短信。在实现过程中,需要注意权限的声明、异步接收的特性以及正确处理短信内容。通过这些知识点,开发者可以构建完整的短信功能模块。