这一节对比上一节动态注册,讲解静态注册广播接收器,实现开机完成后收到系统广播、弹出Toast提示。
1. 动态注册 vs 静态注册核心区别
- 动态注册:代码中
registerReceiver注册,写在Activity的onCreate。APP必须先启动过一次,才能接收广播;APP关闭后就收不到广播,注册和销毁可以手动控制,灵活。 - 静态注册:在
AndroidManifest.xml里写<receiver>标签注册。不需要APP提前启动,系统开机后,会自动唤醒接收器接收系统广播。
2. 完整步骤
① 创建广播接收器类 BootCompleteReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "系统启动完成", Toast.LENGTH_LONG).show();
}
}
Code language: PHP (php)
- 新建方式:AS 右键包 → New → Other → Broadcast Receiver
- 参数说明:
Enabled:是否启用这个接收器 勾选Exported:是否接收本应用以外的系统广播 勾选(这里接收系统开机广播,需要外部广播)
课件里面manifest写
exported="false"是错误,接收系统广播需要exported="true"
② AndroidManifest.xml 添加权限
<!-- 接收开机完成广播权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Code language: HTML, XML (xml)
③ 在 <application> 内静态注册receiver + intent-filter
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- 开机完成Action -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
intent-filter:过滤器,声明这个接收器要接收哪一类广播,这里监听BOOT_COMPLETED系统开机广播。
3. 注意
onReceive() 不能写耗时逻辑! 广播接收器的
onReceive运行在主线程,执行时间限制很短(大概10秒),如果执行大量耗时操作,系统会判定ANR(程序无响应,直接崩溃)。
推荐做法: 接收器只做轻量触发,比如:
- 弹出通知
- 启动后台Service
- 启动Activity 把复杂业务交给Service去处理,不要直接写在onReceive。
Previous: Android 网络掉线/上线广播监听
Next: 发送自定义广播