Android 四大组件之广播

这篇具有很好参考价值的文章主要介绍了Android 四大组件之广播。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、导言

在Android应用开发中,广播组件是一项关键技术,被广泛用于各种任务和场景。无论是发送系统级广播,还是在应用内部实现组件间的通信,了解和掌握广播组件的工作原理和使用方法对于每个Android开发者来说都是至关重要的。本文旨在帮助你深入了解Android广播组件,并给出一些实用的技巧和建议。

带着问题去学习

什么是广播?
广播包含哪些功能?
广播是如何发送和接收的?
如何注册广播,都有哪些注册方式?
都有哪些系统广播?
静态注册和动态注册有什么区别?
Android 如何快速创建一个广播接收器?
如何发送自定义广播?
广播都有哪些类型?
使用广播需要注意哪些安全合规问题?

二、什么是广播(what)

广播(Broadcast)是Android操作系统中一种用于应用程序之间或应用程序内部进行通信的机制。它允许一个应用程序发送消息(广播事件),而其他应用程序可以接收并对这些消息做出响应。

三、广播的发送

1、系统广播

系统广播是由Android操作系统自身发出的广播,用于通知应用程序有关设备状态和系统事件的变化。

常见的系统广播

广播动作 描述 说明
android.net.conn.CONNECTIVITY_CHANGE 网络状态变化 当设备的网络连接状态发生变化时发送的广播。可以通过监听该广播来检测网络连接的变化,并相应地调整应用程序的行为。
android.intent.action.BATTERY_CHANGED 设备电量变化 当设备的电池电量发生变化时发送的广播。应用程序可以通过监听该广播来获取当前电池电量的信息,并根据电量的变化做出相应的操作。
android.intent.action.SCREEN_ON 屏幕开启 当设备的屏幕被开启时发送的广播。应用程序可以通过监听该广播来执行特定的操作,如启动屏幕相关的功能。
android.intent.action.SCREEN_OFF 屏幕关闭 当设备的屏幕被关闭时发送的广播。应用程序可以通过监听该广播来执行相应的操作,如关闭屏幕相关的功能。
android.intent.action.BOOT_COMPLETED 设备启动完成 当设备启动完成后发送的广播。应用程序可以通过监听该广播来执行一些初始化操作或启动特定的服务,以确保应用程序在设备启动后正常运行。
android.intent.action.TIMEZONE_CHANGED 时区变化 当设备的时区发生变化时发送的广播。应用程序可以根据时区的变化来调整与时间相关的功能。
android.intent.action.AIRPLANE_MODE 飞行模式变化 当设备的飞行模式开启或关闭时发送的广播。应用程序可以通过监听该广播来做出相应的操作。
android.intent.action.MEDIA_MOUNTED 存储媒体已挂载 当存储媒体(如SD卡)被挂载到设备上时发送的广播。应用程序可以通过监听该广播来响应存储媒体的挂载事件。
android.intent.action.MEDIA_REMOVED 存储媒体已移除 当存储媒体(如SD卡)从设备中移除时发送的广播。应用程序可以通过监听该广播来做出相应的处理。
android.intent.action.PACKAGE_ADDED 应用程序安装完成 当应用程序安装完成后发送的广播。应用程序可以通过监听该广播来执行相应的操作。
android.intent.action.PACKAGE_REMOVED 应用程序卸载完成 当应用程序卸载完成后发送的广播。应用程序可以通过监听该广播来执行相应的操作。
android.intent.action.HEADSET_PLUG 耳机插拔事件 当耳机被插入或拔出设备时发送的广播。应用程序可以通过监听该广播来做出相应的处理。
android.intent.action.WALLPAPER_CHANGED 壁纸变化 当设备的壁纸发生变化时发送的广播。应用程序可以通过监听该广播来做出相应的处理。

2、自定义广播

在Android中,自定义广播的发送类型与系统广播类似,可以使用标准广播、有序广播和粘性广播

1. 标准广播(Normal Broadcast)

标准广播(Normal Broadcast)是Android中一种常见的广播类型。它是一种异步广播,意味着发送广播后,发送者不会等待接收者的处理结果,而是立即返回。所有匹配该广播的接收者都会同时接收到广播消息。

特点
  1. 广播的发送者不会知道有哪些接收者接收到了广播消息,也无法影响接收者的执行顺序。
  2. 接收者无法中断或取消广播的传递。
  3. 广播的发送和接收是完全异步的,发送者和接收者之间没有直接的交互。
标准广播适用的情况
  • 广播消息不需要有序处理,即接收者之间的执行顺序不重要。
  • 广播消息的发送者不关心接收者的处理结果。
  • 需要将广播发送给所有匹配的接收者,而不需要对广播进行特定的筛选。
代码实现示例
// 创建Intent对象
Intent intent = new Intent();

// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");

// 发送有序广播
sendBroadcast(intent, null);

2. 有序广播(Ordered Broadcast)

有序广播(Ordered Broadcast)是Android中另一种常见的广播类型。与标准广播不同,有序广播是按照优先级顺序依次发送给匹配的接收者,并且每个接收者在处理广播后可以选择终止广播或将广播传递给下一个接收者。

特点
  • 有序广播允许接收者按照优先级顺序处理广播消息。接收者可以通过设置优先级来控制自己在广播链中的执行顺序。
  • 每个接收者可以中断广播的传递,以防止其他接收者继续接收广播消息。
  • 有序广播的发送者可以获取接收者处理广播的结果,因为每个接收者可以返回一个结果代码。
有序广播适用的情况
  • 需要按照特定的顺序处理广播消息,确保接收者按照预期的顺序执行。
  • 需要控制广播的传递,允许接收者中断广播的传递。
  • 需要接收者之间进行通信和协作,通过设置结果代码来返回结果给广播发送者。
代码实现示例
// 创建Intent对象
Intent intent = new Intent();

// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");

// 发送有序广播
sendOrderedBroadcast(intent, null);

3. 粘性广播(Sticky Broadcast)

粘性广播(Sticky Broadcast)是Android中一种特殊类型的广播。与标准广播和有序广播不同,粘性广播会保留在系统中,即使没有匹配的接收者。当有新的接收者注册时,它们会立即收到最新的粘性广播。

特点
  • 粘性广播会被保留在系统中,直到有新的接收者注册为止。即使广播已经发送过一段时间,接收者仍然可以接收到最新的广播消息。
  • 接收者注册后会立即收到最新的粘性广播消息,无需等待下一次广播发送。
  • 粘性广播可以用于将应用程序的状态信息传递给未运行的组件,或者在应用程序重新启动后恢复之前的状态。
粘性广播适用的情况
  • 需要在接收者注册之前发送广播,以确保接收者能够立即获取到最新的广播消息。
  • 需要将广播消息传递给未运行的组件,以便它们能够在接收到广播后立即处理。
  • 需要在应用程序重新启动后恢复之前的状态,通过接收之前发送的粘性广播消息。
代码实现示例
// 创建Intent对象
Intent intent = new Intent();

// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");

// 发送粘性广播
sendStickyBroadcast(intent);

3、本地广播

本地广播(Local Broadcast)是一种特定于应用程序内部的广播机制,用于在应用程序的内部组件之间进行通信。与全局广播不同,本地广播只在应用程序的边界内传播,不会离开应用程序的上下文。

特点

  • 本地广播只在应用程序内部传播,不会泄露给其他应用程序,提供了更高的安全性。
  • 本地广播的传播范围被限制在应用程序的边界内,不会对其他应用程序产生影响。
  • 本地广播的发送和接收是同步的,即发送者会等待接收者的处理结果。

本地广播适用的情况

  • 在应用程序内的组件之间进行通信,而不希望将广播传递给其他应用程序。
  • 需要确保广播消息仅在应用程序的内部有效,避免对其他应用程序产生意外影响。
  • 需要同步等待接收者处理广播消息的结果。

代码示例

// 创建Intent对象
Intent intent = new Intent();

// 设置广播的动作
intent.setAction("com.example.MY_LOCAL_ACTION");

// 发送本地广播
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

四、广播的接收

在Android中,要接收广播,需要创建一个广播接收器(BroadcastReceiver)。广播接收器是一个组件,用于接收和处理发送到应用程序的广播消息。

1. 创建广播接收器类

创建一个继承自BroadcastReceiver的类,并实现onReceive(Context, Intent)方法。在onReceive方法中编写接收到广播后的处理逻辑。

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里编写接收到广播后的处理逻辑
        // 根据广播的动作或其他信息进行相应的操作
    }
}

2. 注册广播接收器

1. 静态注册(Static Registration)

  • 静态注册是在应用程序的清单文件(AndroidManifest.xml)中进行注册,通过在标签中声明广播接收器的类名和相关配置。
  • 静态注册的广播接收器会在应用程序安装时被系统知晓,无论应用程序是否运行,都可以接收广播消息。
  • 示例:
<receiver
    android:name=".MyBroadcastReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.MY_CUSTOM_ACTION" />
    </intent-filter>
</receiver>

2. 动态注册(Dynamic Registration)

  • 动态注册是在应用程序的代码中使用registerReceiver()方法动态注册广播接收器。
  • 动态注册的广播接收器只在调用registerReceiver()方法后才能接收到广播消息,并且在适当的时候需要调用unregisterReceiver()方法取消注册,以避免内存泄漏。
  • 示例:
// 创建广播接收器实例
MyBroadcastReceiver receiver = new MyBroadcastReceiver();

// 创建IntentFilter对象,并添加接收的广播动作
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.MY_CUSTOM_ACTION");

// 注册广播接收器
context.registerReceiver(receiver, filter);

3. 处理接收到的广播

接收到广播后,需要在广播接收器(BroadcastReceiver)的onReceive(Context, Intent)方法中编写处理逻辑

1. 在广播接收器类中实现onReceive方法

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里编写接收到广播后的处理逻辑
    }
}

2. 通过Intent对象获取广播的相关信息

  • 动作(Action):使用getAction()方法获取广播的动作,可以根据动作类型执行相应的操作。
  • 数据(Data):使用getData()方法获取广播的数据,如果广播携带了数据的话。
  • 额外信息(Extras):使用getExtras()方法获取广播的额外信息,可以通过键值对的形式获取特定的信息。
  • 示例:
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Uri data = intent.getData();
        Bundle extras = intent.getExtras();
        
        // 根据广播的动作、数据或额外信息进行相应的处理
    }
}

3. 执行相应的操作

  • 根据广播的动作或其他信息,执行适当的操作,例如更新UI、启动服务、发送通知等。
  • 可以使用上下文(Context)对象来执行特定的操作,例如启动Activity、获取系统服务等。
  • 示例
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        
        if ("com.example.MY_CUSTOM_ACTION".equals(action)) {
            // 执行相应的操作
            // ...
        }
    }
}

五、拓展阅读和资源

广播概览文章来源地址https://www.toymoban.com/news/detail-741926.html

到了这里,关于Android 四大组件之广播的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android四大组件之服务

    为什么要使用服务呢? 从上面的文字说,我们知道这个服务是用于执行长期后台运行的操作。有些时候,我们没有界面,但是程序仍然需要工作。比如说,我们播放音乐,在后台播放音乐。比如说,我们下载任务,在后台下载文件。这些都是没有界面 的后台运行程序,这些

    2024年02月14日
    浏览(63)
  • Android中级——四大组件工作过程

    startActivity()最终都会调用到startActivityForResult() 上面调用Instrumentation的execStartActivity() 上面获取ActivityTaskManagerService,是IPC过程,调用其startActivity()启动,然后调到startActivityAsUser() 上面通过ActivityStartController获取ActivityStarter,调用execute(),调用resolveActivity()根据Intent匹配到对应的

    2024年02月11日
    浏览(26)
  • Android 四大组件之Activity详解

      最近在整理Android方面的知识,也算是对Android知识的一个复习总结。   Activity是Android组件中最基本也是最为常见用的四大组件之一,它提供一个可视化的用户界面,放置各种UI组件,与用户进行交互。一般来说,你所能看到界面都属于Activity。 右击包名——New——Acti

    2024年04月15日
    浏览(55)
  • Android复习(Android基础-四大组件)——Service与Activity通信

    我们前面学会了启动和停止服务的方法,但是服务虽然是在活动里启动的,但是启动服务之后,活动与服务之间基本没什么关系了。 正常情况,我们在Activity里调用startService()方法启动MyService这个服务,然后MyService的onCreate()和onStartCommand()方法就会得到执行。之后服务会一直处

    2024年02月13日
    浏览(30)
  • Android入门教程 | 四大组件之Service(前台服务,后台服务)

    Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可在后台处理网络事务、播放

    2024年02月05日
    浏览(42)
  • Android进阶 四大组件的工作过程(一):Activity的工作过程

    本系列文章主要是来介绍Android中四大组件的工作过程的,参照书籍为Android进阶解密,主要还是会涉及到源码的阅读。关于源码,大家可以到Android Code Search上查看,网址放在这里了:Android Code Search。除此之外,最好还需要掌握一些Android系统启动过程的知识: Android系统的启动

    2024年02月09日
    浏览(39)
  • Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……),腾讯安卓开发面试

    5.请介绍下 AsyncTask的内部实现,适用的场景是 AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来 执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务, 比如 HTTP 请求,大规模的下载和数据库的更改不

    2024年04月15日
    浏览(44)
  • Android端MVVM从入门到实战(第一篇) - MVVM和四大官方组件

    MVVM是相对于MVC和MVP的一个概念,是一种架构模式。 1.1 MVC 传统的MVC中,View改变通知Controller进行处理,Controller处理结束后通知Model层更新,Model层更新以后通知View层渲染,指令单项流动,角色分工明确。但是MVC有三个缺点,1、三个角色互相持有对方依赖,因此很难复用其中任

    2024年02月04日
    浏览(29)
  • Android 四大布局使用详解

    和你一起终身学 习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、LinearLayout 线性布局 二、RelativeLayout 关系布局 三、FrameLayout 帧布局 四、TableLayout 表格布局 在 Android  中,有界面存在的地方就会有布局存在,布局对于 Android 来说十分重要。

    2024年02月16日
    浏览(23)
  • Android 蓝牙广播

    ( BluetoothAdapter.ACTION_STATE_CHANGED ):当蓝牙状态发生变化时发送,可以用于检测蓝牙的开启或关闭状态。 提供了以下 Extra 值来描述相关信息: BluetoothAdapter.EXTRA_STATE: 表示蓝牙的当前状态。你可以使用 intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR) 来获取该值。其可

    2024年02月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包