一个例子-接收系统广播

一、广播(Broadcast)基础概念

1. 什么是系统广播

  • Android 内置了大量系统级广播,用于通知系统状态变化
  • 常见系统广播:
    • 电量低 / 电量变化
    • 开机完成(BOOT_COMPLETED
    • 网络状态变化(CONNECTIVITY_CHANGE
    • 飞行模式切换
    • 时间/时区变化

2. 广播接收器的作用

  • 应用通过注册广播接收器,监听感兴趣的广播
  • 广播到达时,系统自动回调接收器的 onReceive() 方法
  • onReceive() 中编写业务逻辑

二、广播的两种注册方式

对比项动态注册(代码注册)静态注册(Manifest 注册)
注册位置Activity / Service 等组件中AndroidManifest.xml
生命周期与注册组件绑定独立于组件,应用未启动也能接收
灵活性高,可随时注册/注销低,安装时确定
适用场景需要感知组件生命周期的广播全局广播、开机启动等
高版本限制无特殊限制Android 8.0+ 对隐式广播有大量限制

重要CONNECTIVITY_CHANGE(网络变化)广播在 Android 7.0+ 不允许静态注册,必须使用动态注册。

三、创建广播接收器

基本步骤

  1. 新建一个类,继承 BroadcastReceiver
  2. 重写 onReceive(Context context, Intent intent) 方法
  3. onReceive() 中处理接收到的广播逻辑

代码

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理广播逻辑
    }
}Code language: PHP (php)

四、动态注册完整流程

1. 定义成员变量

private NetworkChangeReceiver networkChangeReceiver;
private IntentFilter intentFilter;Code language: PHP (php)

2. 在 onCreate() 中注册

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    networkChangeReceiver = new NetworkChangeReceiver();
    intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(networkChangeReceiver, intentFilter);
}Code language: JavaScript (javascript)

3. 在 onDestroy() 中注销(必须!)

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(networkChangeReceiver);
}Code language: CSS (css)

4. 定义接收器内部类

class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "网络改变了", Toast.LENGTH_LONG).show();
    }
}Code language: JavaScript (javascript)

发表回复

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