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日

相关文章

  • express+vue+mongodb+session 实现注册登录功能

    下面是详细讲解“express+vue+mongodb+session 实现注册登录功能”的完整攻略: 准备工作 首先,我们需要在本地安装Node.js和MongoDB,然后新建一个名为“project”的文件夹,用于存放我们的代码。接下来,进入“project”文件夹,并在命令行中执行以下命令来初始化我们的项目: npm init -y 安装依赖包 我们需…

    人工智能概论 2023年5月25日
    00
  • 基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析

    基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析 书店案例分析的实现,我们将使用Node.js作为编写后端服务器的JavaScript运行时,MongoDB作为数据存储和检索的数据库,AngularJS和Bootstrap框架作为前端实现工具。 步骤一:在个人电脑上安装与配置上述所需软件(以windows系统为例)。 …

    人工智能概论 2023年5月25日
    00
  • window10下pytorch和torchvision CPU版本安装教程

    下面是关于在Windows 10上安装PyTorch和torchvision的完整攻略。 环境准备 在开始安装过程之前,我们需要确保本地环境已经安装了Anaconda。这里以安装Anaconda最新版为例。 创建虚拟环境 首先,我们需要在Anaconda中创建一个新的虚拟环境来安装PyTorch和torchvision。在Anaconda Prompt命令行…

    人工智能概览 2023年5月25日
    00
  • conda常用命令整理及用法详解

    Conda常用命令整理及用法详解 Conda是一个Python的包管理器,它可以方便地安装、更新和删除Python包及其依赖项。本文将介绍一些conda常用命令,并详细说明它们的用法。 1. Conda环境管理 1.1 创建和管理环境 创建环境:可以使用conda create命令创建一个新的conda环境。 conda create –name env_…

    人工智能概览 2023年5月25日
    00
  • Windows下的Jupyter Notebook 安装与自定义启动(图文详解)

    Windows下的Jupyter Notebook 安装与自定义启动(图文详解) Jupyter Notebook 是一个非常流行的交互式笔记本,它支持多种编程语言,包括 Python、R、Julia 等。在本文中,我们将讲解如何在 Windows 上安装并自定义启动 Jupyter Notebook。 安装Anaconda 要安装 Jupyter Note…

    人工智能概览 2023年5月25日
    00
  • 在Django中动态地过滤查询集的实现

    在Django中,我们可以使用QuerySet对象来进行数据库操作,包括增删改查等。而有时候我们需要在查询的时候进行动态的过滤,通常是由用户选择输入不同的过滤条件导致的。 以下是在Django中动态地过滤查询集的实现的完整攻略: 步骤一:建立基础查询集 首先,我们需要建立一个基础的QuerySet对象,这个QuerySet对象是没有经过任何过滤的,可以通过以…

    人工智能概论 2023年5月25日
    00
  • pytorch实现梯度下降和反向传播图文详细讲解

    下面我会给出一份“pytorch实现梯度下降和反向传播图文详细讲解”的攻略,希望可以帮助到您。 1. 概述 梯度下降是深度学习中常用的优化算法之一,用于更新模型参数从而使得损失函数尽可能小。而反向传播是计算梯度的一种常用方法,用于计算神经网络中所有参数的梯度。本攻略将详细介绍如何使用PyTorch实现梯度下降和反向传播。 2. 梯度下降 在PyTorch中,…

    人工智能概论 2023年5月25日
    00
  • C# 使用AspriseOCR.dll实现验证码识别

    C# 使用AspriseOCR.dll实现验证码识别 本文将介绍如何使用AspriseOCR.dll实现验证码识别,AspriseOCR.dll是一款非常优秀的OCR识别库,能够实现各种验证码的识别。 安装AspriseOCR.dll 首先,我们需要下载AspriseOCR.dll,可以在官网 https://asprise.com/ocr/ 下载。下载完成…

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