前言
实践是最好的学习方式,技术也如此。
文章目录
- 前言
- 一、
- 二、实践
- 1、发送和接收系统广播
- 2、发送和接收自定义广播
一、
- 广播是 Android 系统和 Android 应用程序在发生可能影响其他应用程序组件功能的事件时发送的消息;
- 广播是Android系统中的一种进程间通信方式,它可以用来在不同组件之间传递事件通知;
- 进程:在Android系统中,每个运行的应用程序都会以一个进程(Process)的形式存在;
- 进程可以理解为一个应用程序的运行实例,它拥有自己独立的资源和内存空间。进程是Android系统进行资源分配和调度的基本单位。
- 其他应用如果注册了相应的广播接收器(Broadcast Receiver),就可以在收到广播时得到通知,进而做出响应。比如音乐App在耳机拔出时会接收到广播,然后暂停正在播放的音乐。
- 系统广播:系统广播是Android框架在某些系统事件发生时自动发送出去的广播;系统事件比如开机启动、网络状态变化、电量变化等
- 自定义广播:除了接收和响应系统级广播事件以外,Android应用也可以自己发送自定义的广播事件,以通知其他组件或应用。例如,一个新闻App在下载完最新新闻后,可以发送一个"com.news.NEW_NEWS_DOWNLOADED"的广播。其他感兴趣的App如果注册了这个广播,就可以在接收到该广播时作出响应,比如去拉取并显示这些最新新闻。所以自定义广播可以像系统广播一样,提供一种应用或组件之间相互通信的方式。
- 广播机制:当一个广播事件被发送出去后,系统会将这条广播传递给所有注册了对应的广播接收器(BroadcastReceiver)的应用或组件。
- BroadcastReceiver 基类
- BroadcastReceiver是一个抽象类,用于接收和处理广播;
- 开发者需要自定义一个BroadcastReceiver的子类来实现广播接收逻辑;
- 在BroadcastReceiver子类中主要需要实现onReceive()方法,当收到广播时系统会回调此方法;
- onReceive()中可以根据Intent的内容进行处理,如读取数据、启动服务
二、实践
1、发送和接收系统广播
- 创建一个应用程序来响应设备充电状态的变化;
- 在设备连接或断开电源时显示一条 Toast 消息。该应用程序还将发送和接收自定义广播以显示不同的 toast 消息;
- Intent
- 作用:Intent是Android程序各组件之间进行交互和通信的重要方式;通过组合不同的Action和Data,Intent可以描述出要执行的不同任务
- 使用
- 参数:Intent主要包含以下两个部分
- Action:意图动作,Intent要完成的动作,如启动Activity,启动Service等;
- Data:携带的数据,可以是uri地址,也可以是额外的信息;
- 解析Intent的内容来启动不同的组件,完成相应的工作
- 参数:Intent主要包含以下两个部分
- 系统广播是Android系统在系统事件发生时发送的消息。每个系统广播都包装在一个 Intent 对象中:系统事件发生时,系统会生成一个对应的Intent对象,用来封装这个系统事件的广播信息,然后系统会把这个Intent对象发送出去,作为系统广播;应用程序可以通过在清单文件中注册BroadcastReceiver,并过滤对应的系统广播Action来接收这个Intent。
一旦接收到,就可以从Intent中解析出系统事件的详细信息。
-
两个系统广播
- ACTION_POWER_CONNECTED:表示电源被断开,设备已脱离供电;这个action的Intent会在电源断开时由系统广播出去
- ACTION_POWER_DISCONNECTED:表示电源被连接,设备已连接到供电;会在连接电源时由系统广播这个action的Intent
-
静态注册:在AndroidManifest.xml里声明,并通过指定接收的广播action
-
动态注册:在代码中通过Context.registerReceiver()来注册,同样可以指定IntentFilter来过滤广播
-
Intent Filter:类似一个过滤网,只留下特定类型的Intent
- 是一种过滤机制,它用于指定某个组件能够接收什么类型的Intent
- Action:Intent的动作,Data:数据URI,Category:分类信息
- 当一个Activity声明了某个Intent Filter时,只有匹配这个Filter的Intent才能启动这个Activity。Intent Filter通过配置Intent中的action、data、category等信息,来过滤掉不匹配的Intent,只让特定的Intent可以传递到该组件。
-
当系统发出或接收到一个广播Intent时,会遍历所有已注册的广播接收器(BroadcastReceiver),判断其IntentFilter是否与当前Intent匹配。
-
匹配的判断规则是:
- Action相同
- Category相同
- Data schemes或类型相同
- 如果一个接收器的IntentFilter与当前Intent同时匹配上这3项,就认为它可以接收这个广播。
- 例如,IntentFilter指定了"android.intent.action.BOOT_COMPLETED"的Action,当系统启动完成的Intent被广播时,这个接收器就能收到。
-
2、发送和接收自定义广播
-
除了响应系统广播之外,您的应用程序还可以发送和接收自定义广播;如当您希望应用程序在不启动 Activity 的情况下执行操作;
-
Android 为您的应用提供了三种发送自定义广播的方式
- 普通广播:普通广播适合那些不依赖调用顺序,所有接收器可以并发处理的场景
- 本地广播:本地广播只会在应用内部传递,不会像普通广播那样系统级别传播(所以本地广播适用于应用内组件间的通信,是一种更轻量级的内部广播方式)
- 有序广播:有序广播允许接收器按顺序步骤处理,并传递数据或截断
-
任务:您将向 Activity 添加一个发送本地广播意图的按钮。您的接收器注册广播 Intent 并在 Toast 消息中显示结果;