安卓广播处理系统事件,短信数据库存储信息,应用监听广播可读写 数据库
安卓广播机制
广播类型
类型 | 说明 | 触发场景 |
系统广播 | 由系统事件触发(如网络变化、电量不足) | 系统级事件通知 |
应用内广播 | 同一应用内组件间通信 | 自定义事件传递 |
有序广播 | 按优先级顺序传递,可中断 | 需按顺序处理的事件(如闹钟) |
无序广播 | 无顺序广播,无法被截断 | 全局通知(如屏幕熄灭) |
核心组件
- BroadcastReceiver:接收广播的组件
- IntentFilter:声明接收的广播类型
- LocalBroadcastManager:应用内广播管理器(避免跨应用泄露)
注册方式
方式 | 特点 | 适用场景 |
静态注册(AndroidManifest) | 常驻生效,系统重启后仍有效 | 系统级广播(如开机启动) |
动态注册(代码) | 需在运行时注册,灵活性高 | 临时性广播监听 |
短信数据库操作
内容提供者(ContentProvider)
- 访问入口:
content://sms/
(Android Q以下) - 权限要求:
READ_SMS
:读取短信 WRITE_SMS
:发送/删除短信 RECEIVE_SMS
:监听短信到达
短信URI结构
URI | 说明 |
content://sms/inbox | 收件箱 |
content://sms/sent | 已发送 |
content://sms/draft | 草稿箱 |
content://sms/outbox | 发件箱(部分ROM支持) |
常用字段
字段名 | 类型 | 说明 |
_id | INTEGER | 唯一标识 |
address | TEXT | 手机号 |
date | INTEGER | 时间戳 |
body | TEXT |
type | INTEGER | 短信类型(1=收件,2=发件) |
操作示例
// 查询收件箱短信
Uri uri = Uri.parse("content://sms/inbox");
Cursor cursor = getContentResolver().query(uri, null, null, null, "date DESC");
while (cursor.moveToNext()) {
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
// 处理数据
}
广播与短信数据库关联场景
场景 | 广播类型 | 触发条件 | 处理逻辑 |
短信到达通知 | RECEIVE_SMS | 新短信接收 | 通过BroadcastReceiver 读取数据库并解析内容 |
短信发送状态 | SENT_SMS_ACTION | 短信发送完成 | 更新数据库状态字段 |
相关问题与解答
问题1:如何监听短信到达并获取内容?
解答:

- 在
AndroidManifest.xml
中注册RECEIVE_SMS
权限和广播接收器: <uses-permission android:name="android.permission.RECEIVE_SMS"/>
<receiver android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
- 在
BroadcastReceiver
中通过Bundle
提取短信内容: public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("pdus");
for (Object pdu : pdus) {
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String content = sms.getMessageBody();
// 处理短信内容
}
}
}
问题2:Android Q以上版本如何访问加密短信数据库?
解答:
- 使用
Telephony.Sms.CONVERSATIONS
替代传统URI: Uri conversationUri = Uri.parse("content://telephony/smsinbox"); // Android Q+推荐
- 通过
Conversation
表关联消息: SELECT FROM sms JOIN conversations
ON sms.conversation_id = conversations._id;
- 注意动态申请
READ_EXTERNAL_STORAGE
权限(部分厂商兼容