在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`,系统对隐式广播做了限制,大多数隐式广播不再被系统发送,除非你的应用是目标应用的默认短信应用、默认拨号应用等。因此,对于这些版本,建议尽可能使用动态注册来接收广播。