安卓广播处理系统事件,短信数据库存储信息,应用监听广播可读写
数据库
安卓广播机制
广播类型
类型 |
说明 |
触发场景 |
系统广播 |
由系统事件触发(如网络变化、电量不足) |
系统级事件通知 |
应用内广播 |
同一应用内组件间通信 |
自定义事件传递 |
有序广播 |
按优先级顺序传递,可中断 |
需按顺序处理的事件(如闹钟) |
无序广播 |
无顺序广播,无法被截断 |
全局通知(如屏幕熄灭) |
核心组件
- 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
权限(部分厂商兼容