Android四大组件之broadcast广播详解

Android四大组件之broadcast广播详解

在Android应用中,Broadcast广播是一种非常重要的组件。它可以在应用内部或应用之间传递消息,帮助我们处理系统级别的事件,比如网络状态变化、电池电量变化、时间时钟等,同时也可以自定义消息传递,使我们的应用更加灵活。

一、Broadcast广播的概念及其种类

Broadcast广播时一种异步的消息收发机制,可以让应用中的不同组件或不同应用之间进行通信。Android中的Broadcast广播分为两种类型:标准广播和有序广播。

1. 标准广播

标准广播是异步完成的,不同组件之间没有先后顺序的关系。它是完全异步执行的,并且无法被截断,无法被取消。发送标准广播的代码如下:

Intent intent = new Intent("custom.action.MY_BROADCAST");// 创建一个intent对象
intent.putExtra("name", "Tom");// 设置广播携带的参数
sendBroadcast(intent);// 发送广播

2. 有序广播

有序广播是有序执行的,它会按照广播注册的先后顺序依次执行每一个接收者。有序广播可以截断并且取消,只要有一个接收者截断了广播,后面所有的接收者都无法再接收到此广播。发送有序广播的代码如下:

Intent intent = new Intent("custom.action.MY_BROADCAST");// 创建一个intent对象
intent.putExtra("account", "1345XXXXXX");// 设置广播携带的参数
sendOrderedBroadcast(intent, null);// 发送广播

二、Broadcast广播的实现方法

1. 静态注册

静态注册是指将BroadcastReceiver在AndroidManifest.xml文件中注册,这种方式优点是可以在应用未运行时也能正确接收Broadcast广播,同时广播接收者可以得到所有广播,无论应用是否在前台,缺点是不管你要用不要用,广播接收者都会创建实例,从而会消耗一定的内存和CPU。

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

    <application>  
        <receiver android:name=".MyBroadcastReceiver" >  
            <intent-filter>  
                <action android:name="com.example.broadcastreceiver" />  
            </intent-filter>  
        </receiver>  
    </application>

</manifest>
public class MyBroadcastReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Toast.makeText(context, "Received a broadcast message", Toast.LENGTH_LONG).show();  
    }  
}  

2. 动态注册

动态注册BroadcastReceiver需要在代码中通过registerReceiver()方法进行注册,并且需要注意在不需要使用了的时候要主动unregisterReceiver()进行注销,否则会造成内存泄漏。

public class MyActivity extends Activity {
    private static final String ACTION_CUSTOM_BROADCAST = BuildConfig.APPLICATION_ID + ".ACTION_CUSTOM_BROADCAST";
    private MyBroadcastReceiver mReceiver;

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

        // 1. 创建 BroadcastReceiver 子类实例
        mReceiver = new MyBroadcastReceiver();

        // 2. 创建 IntentFilter 实例
        IntentFilter intentFilter = new IntentFilter();

        // 3. 添加想要监听的广播
        intentFilter.addAction(ACTION_CUSTOM_BROADCAST);

        // 4. 动态注册广播
        registerReceiver(mReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 5. 取消注册广播
        unregisterReceiver(mReceiver);
    }
}
public class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String ACTION_CUSTOM_BROADCAST = BuildConfig.APPLICATION_ID + ".ACTION_CUSTOM_BROADCAST";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_CUSTOM_BROADCAST.equals(action)) {
            String name = intent.getStringExtra("name");
            Toast.makeText(context, "Received a custom broadcast message, name: " + name, Toast.LENGTH_LONG).show();
        }
    }
}

三、Broadcast使用示例

1. 监听网络变化

我们可以使用系统广播来监听网络状态的变化,这里需要动态注册。代码如下:

public class NetworkStateReceiver extends BroadcastReceiver {
    private ConnectivityManager mConnectivityManager;
    private NetworkInfo mLastNetworkInfo;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (mConnectivityManager == null) {
            mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        }

        // 获取当前的网络状态信息
        NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
        if (networkInfo == null) {
            return;
        }

        // 如果当前的网络状态已变化
        if (mLastNetworkInfo != null && mLastNetworkInfo.getState() == networkInfo.getState()) {
            return;
        }

        // 更新最新的网络状态信息
        mLastNetworkInfo = networkInfo;

        // 执行相应的网络状态处理
        if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {
            // 网络连接已断开
            Toast.makeText(context, "网络连接已断开", Toast.LENGTH_SHORT).show();
        } else if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
            // 网络连接已恢复
            Toast.makeText(context, "网络连接已恢复", Toast.LENGTH_SHORT).show();
        }
    }
}
public class MainActivity extends AppCompatActivity {
    private NetworkStateReceiver mNetworkStateReceiver;

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

        // 注册网络状态广播
        mNetworkStateReceiver = new NetworkStateReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(mNetworkStateReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 取消注册网络状态广播
        unregisterReceiver(mNetworkStateReceiver);
    }
}

2. 发送自定义广播

我们也可以自定义广播,来实现不同组件之间的数据交互。代码如下:

// 发送广播
Intent intent = new Intent(ACTION_CUSTOM_BROADCAST);
intent.putExtra("name", "Tom");
sendBroadcast(intent);

// 接收广播
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_CUSTOM_BROADCAST.equals(action)) {
            String name = intent.getStringExtra("name");
            Toast.makeText(context, "Received a custom broadcast message, name: " + name, Toast.LENGTH_LONG).show();
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android四大组件之broadcast广播详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • django 多对多表的创建和插入代码实现

    创建和操作多对多关系是 Django 中常见的任务之一。Django 为多对多关系创建了一个专门的字段 ManyToManyField。这个字段定义在模型中,允许一个模型与另一个或多个模型建立多对多关系。在本篇攻略中,我们将介绍 Django 中如何定义和使用 ManyToManyField。 定义 ManyToManyField 在 Django 中,我们…

    人工智能概论 2023年5月25日
    00
  • python实现宿舍管理系统

    Python实现宿舍管理系统攻略 1. 概述 宿舍管理系统是一个可以对宿舍进行管理的项目。它可以记录住宿生的个人信息、住宿信息、缴费情况等,并且可以同时实现对违规宿舍的管理,包括违规记录、惩罚等功能。本文将详细讲解如何使用Python实现宿舍管理系统。 2. 数据库设计 宿舍管理系统需要使用到数据库来存储数据。在设计数据库时,需要考虑到系统所需记录的信息。以…

    人工智能概览 2023年5月25日
    00
  • Python OpenCV学习之图像形态学

    Python OpenCV学习之图像形态学 简介 图像形态学是图像处理中重要的一环,常常用于消除图像噪声和边缘检测等。OpenCV提供了一系列的图像形态学操作,包括腐蚀(erode)、膨胀(dilate)、开(open)、闭(close)等。 腐蚀(erode) 腐蚀操作主要用于消除小的亮点或白色噪点等,是对图像的缩小操作,可以使图像中的轮廓细化,使之保持原…

    人工智能概论 2023年5月25日
    00
  • Python Flask实现后台任务轻松构建高效API应用

    下面是Python Flask实现后台任务轻松构建高效API应用的攻略: 简介 Python Flask是一个用于构建Web应用程序和API的轻量级框架。被广泛应用于开发RESTful API。此外,Python Flask中还提供了轻便的异步任务队列库,可以方便地实现后台任务。将后台任务和API结合使用,可以更加高效地构建API应用程序。 步骤 第一步:安…

    人工智能概论 2023年5月25日
    00
  • OpenCV模板匹配matchTemplate的实现

    我会详细讲解 “OpenCV模板匹配matchTemplate的实现”的完整攻略,下面是具体的步骤: 1. 准备工作 首先,我们需要引入OpenCV库,并导入需要的头文件。在C++代码中,我们可以使用以下代码实现引入: #include <opencv2/opencv.hpp> using namespace cv; 2. 读取图像 我们需要先读…

    人工智能概论 2023年5月24日
    00
  • SpringCloud Gateway读取Request Body方式

    Spring Cloud Gateway 是 Spring 提供的网关模块,它可以拦截请求并转发给具体的服务,同时也可以在请求到达网关时做一些通用的处理,比如增加请求头、限流等。 当我们需要使用网关作为请求入口时,尤其是需要一些路由转发或者拦截操作时,我们往往需要获取前端请求发送的参数。在 Spring Cloud Gateway 中,我们可以通过使用 Se…

    人工智能概览 2023年5月25日
    00
  • Python简易版停车管理系统

    下面我详细讲解“Python简易版停车管理系统”的完整攻略。 简介 停车管理系统是一个基于Python编写的简单项目,它模拟了一个停车场中的车辆停放、取车的过程。系统通过车位号来进行管理,用户可以查询空余车位、停车、取车等操作。 技术栈 Python3 文件读写 功能说明 实现的功能如下: 查询空余车位 停车 取车 退出系统 项目实现 1. 创建停车场 我们…

    人工智能概览 2023年5月25日
    00
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本)

    Python淘宝或京东等秒杀抢购脚本实现,通常需要模拟用户在网站上手动选购商品,提交订单等操作。一般而言,实现秒杀脚本的流程可以分为以下几个步骤: 步骤一:分析目标网站 首先需要了解目标网站的网络通信协议,以及目标页面的HTML结构、JS代码等。通常可以使用浏览器的开发者工具查看页面元素、请求信息、响应数据等,并使用Python的requests、Beaut…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部