静态注册的方式实现开机提示

这一节对比上一节动态注册,讲解静态注册广播接收器,实现开机完成后收到系统广播、弹出Toast提示。

1. 动态注册 vs 静态注册核心区别

  • 动态注册:代码中registerReceiver注册,写在Activity的onCreateAPP必须先启动过一次,才能接收广播;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(程序无响应,直接崩溃)。

推荐做法: 接收器只做轻量触发,比如:

  1. 弹出通知
  2. 启动后台Service
  3. 启动Activity 把复杂业务交给Service去处理,不要直接写在onReceive。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注