【Android从零单排系列三十八】《Android四大组件——BroadcastReceiver》

2023-07-17 20:34:47 浏览数 (1)

前言

小伙伴们,在上文中我们介绍了Android组件Service,本文我们继续盘点介绍Android开发中另一个非常重要的组件BroadcastReceiver。

一 BroadcastReceiver基本介绍

BroadcastReceiver(广播接收器)是Android中的一个组件,用于接收和响应系统或应用发送的广播消息。它允许应用程序在某些事件发生时收到通知并采取相应操作。

BroadcastReceiver通过注册到系统中指定的广播过滤器来接收广播消息。当匹配的广播消息被发送时,系统将自动调用BroadcastReceiver的onReceive()方法,并传递广播消息作为参数。开发者可以在onReceive()方法中编写自定义的逻辑来处理接收到的广播消息。

二 BroadcastReceiver使用方法

BroadcastReceiver的使用方法如下:

创建一个自定义的BroadcastReceiver类,继承自android.content.BroadcastReceiver,并重写onReceive()方法。在onReceive()方法中编写接收到广播后的逻辑代码。

代码语言:javascript复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里编写接收到广播后的逻辑代码
    }
}

在需要接收广播的地方注册BroadcastReceiver。可以通过两种方式进行注册:

a. 使用静态注册(在AndroidManifest.xml文件中注册):

  • 打开AndroidManifest.xml文件,找到<application>标签内部。
  • <application>标签内部添加一个<receiver>标签,并设置name属性为你自定义的BroadcastReceiver类的完整名称。
  • <receiver>标签内部添加一个或多个<intent-filter>标签,用于指定你所关心的广播消息和对应的优先级。
代码语言:javascript复制
<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <!-- 设置你所关心的广播消息,例如系统启动完成 -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <!-- 添加其他关心的广播消息 -->
        ...
    </intent-filter>
</receiver>

b. 使用动态注册(在代码中注册):

  • 创建一个BroadcastReceiver实例,并使用registerReceiver()方法进行注册。
代码语言:javascript复制
MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 添加你所关心的广播消息,例如系统启动完成
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
// 添加其他关心的广播消息
...

// 注册BroadcastReceiver
context.registerReceiver(myReceiver, intentFilter);

完成注册后,在对应的事件发生时,BroadcastReceiver将接收到广播消息并调用onReceive()方法。在onReceive()方法中编写接收到广播后的逻辑代码。

注意事项:

  • 在静态注册时,请确保在AndroidManifest.xml文件中正确声明权限和过滤器。
  • 在动态注册时,需要按照相应的生命周期管理好BroadcastReceiver的注册和反注册,避免内存泄漏。
  • 如果BroadcastReceiver需要与其他组件进行通信,可以使用发送广播、启动服务等方式实现。
  • 需要注意Android 8.0及以上版本对隐式广播的

三 BroadcastReceiver常见属性及方法

roadcastReceiver是Android中常用的一个组件,以下是它的三个常见属性和方法:

  1. 属性:
  • Context:BroadcastReceiver的Context属性表示所属的上下文对象,可以通过getContext()方法获取。在接收到广播时,可以使用该属性进行相关操作,如启动服务、发送广播等。
  1. 方法:

onReceive(Context context, Intent intent):这是BroadcastReceiver必须实现的方法,用于接收到广播时处理逻辑。当广播被发送时,该方法会被自动调用。参数包括上下文Context和广播携带的Intent对象,可以通过Intent对象获取传递的数据和操作。

代码语言:javascript复制
@Override
public void onReceive(Context context, Intent intent) {
    // 处理接收到的广播逻辑
}

abortBroadcast():该方法用于终止广播,即在该方法之后,其他具有较低优先级的广播接收者将不再接收同一条广播。

代码语言:javascript复制
@Override
public void onReceive(Context context, Intent intent) {
    // 判断条件,如果需要终止广播
    if (condition) {
        abortBroadcast();
    }
}

setResultCode(int code) / getResultCode():这些方法用于设置或获取广播处理结果代码。在发送广播时,可以设置一个初始的结果代码,接收者在处理广播时,可以根据需要修改或获取结果代码。结果代码通常用于指示广播处理状态。

代码语言:javascript复制
@Override
public void onReceive(Context context, Intent intent) {
    // 获取之前设置的结果代码
    int resultCode = getResultCode();
    // 根据需要修改结果代码
    setResultCode(resultCode   1);
}

四 BroadcastReceiver简单案例

以下是一个简单的BroadcastReceiver案例,用于接收系统广播并显示Toast消息:

代码语言:javascript复制
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 判断接收到的广播类型
        if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            // 插入电源时的操作
            Toast.makeText(context, "充电器已连接", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            // 断开电源时的操作
            Toast.makeText(context, "充电器已断开", Toast.LENGTH_SHORT).show();
        }
    }
}

在AndroidManifest.xml文件中注册该BroadcastReceiver:

代码语言:javascript复制
<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <!-- 接收系统的充电状态改变广播 -->
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
    </intent-filter>
</receiver>

以上代码示例创建了一个自定义的BroadcastReceiver类,通过判断接收到的广播类型进行相应的操作。在这个例子中,当插入或断开电源时,会分别显示对应的Toast消息。在AndroidManifest.xml文件中注册了该BroadcastReceiver,并指定了需要接收的广播类型。

五 总结

  • BroadcastReceiver用于接收系统或应用发送的广播消息。
  • BroadcastReceiver必须实现onReceive(Context context, Intent intent)方法来处理接收到的广播消息。
  • 在AndroidManifest.xml文件中注册BroadcastReceiver,或者通过代码动态注册和注销。
  • 可以通过intent-filter指定要接收的广播类型,也可以通过setAction方法设置特定的广播动作。
  • 使用registerReceiver()方法注册动态广播接收器,并使用unregisterReceiver()方法注销。
  • BroadcastRecevier可以在接收到广播后执行一些操作,如启动服务、显示通知、更新UI等。
  • 可以使用abortBroadcast()方法终止广播以阻止其传递给其他接收者。
  • 可以通过setResultCode()和getResultCode()方法设置和获取广播的结果代码。

在开发过程中要避免在BroadcastReceiver中进行耗时操作,因为它们是在主线程上执行的。如果有长时间运行的任务,建议使用IntentService或创建独立线程来处理。

BroadcastReceiver在Android开发中具有广泛的应用,例如监听网络状态变化、监听系统事件、管理通知等。它提供了一种机制,允许应用程序间的通信和交互,使得不同组件能够及时响应和处理相关的消息。

0 人点赞