Android中BroadcastReceiver(异步接收广播Intent)的使用


在Android开发中,`BroadcastReceiver` 是一个用于接收并响应系统或应用内广播Intent的组件。它是异步的,意味着它不会阻塞主线程(UI线程)的执行。下面是一个简单的示例,展示了如何在Android应用中使用 `BroadcastReceiver` 来接收系统广播(例如,开机完成广播)。

### 1. 定义BroadcastReceiver

首先,你需要创建一个继承自 `BroadcastReceiver` 的类,并重写 `onReceive` 方法来处理接收到的Intent。


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class BootCompletedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            // 设备开机完成后的操作
            Toast.makeText(context, "设备已开机", Toast.LENGTH_SHORT).show();
        }
    }
}

### 2. 注册BroadcastReceiver

有两种方式可以注册 `BroadcastReceiver`:在 `AndroidManifest.xml` 中静态注册,或在代码中动态注册。

#### 静态注册(在AndroidManifest.xml中)

为了接收系统广播(如开机完成),你必须在 `AndroidManifest.xml` 中静态注册你的 `BroadcastReceiver`,并添加相应的权限(如果需要)。


<receiver android:name=".BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

注意:接收开机完成广播需要添加 `RECEIVE_BOOT_COMPLETED` 权限。


<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

#### 动态注册(在代码中)

对于非系统广播或需要在特定条件下接收广播的情况,可以在代码中动态注册 `BroadcastReceiver`。


BroadcastReceiver myReceiver = new BootCompletedReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
registerReceiver(myReceiver, filter);

// 注意:动态注册的BroadcastReceiver需要在适当的时候(如Activity的onDestroy方法中)注销,避免内存泄漏。

### 注意事项

- 对于系统广播,特别是那些需要特殊权限的广播(如开机完成),你需要在 `AndroidManifest.xml` 中静态注册你的 `BroadcastReceiver` 并添加相应的权限。

- 静态注册的 `BroadcastReceiver` 在应用未运行时也能接收广播。

- 动态注册的 `BroadcastReceiver` 必须在应用运行时注册和注销,且仅当应用处于活动状态时才能接收广播。

- 在API 26(Android 8.0)及以上版本中,对于静态注册的 `BroadcastReceiver`,系统对隐式广播做了限制,大多数隐式广播不再被系统发送,除非你的应用是目标应用的默认短信应用、默认拨号应用等。因此,对于这些版本,建议尽可能使用动态注册来接收广播。