一、BroadcastReceiver介绍
BroadcastReceiver是一个全局的监听器,它可以监听安卓系统、其他App、自己App发出的广播。并作出相应的处理。是安卓的四大组件之一。
-
广播发送者:发送广播,发布广播后,订阅过的接收者就可以接收到广播。
-
广播接收者:接收广播(想要接收广播,必须要注册即订阅相应的广播)
发布者、订阅者,一听我们就想到了“观察者设计模式”,没错安卓中的广播机制就是基于观察者模式的,只不过安卓中通过“消息中心ASM”来处理沟通广播接收者、发送者。为啥要把ASM设计为消息中心呢?
BroadcastReceiver原理基于观察者模式的,只不过安卓中通过“消息中心ASM”来处理沟通广播接收者、发送者。为啥要把ASM设计为消息中心呢?
这就考虑到广播发送者、接收者的作用了即发送、接收全局消息。这时肯定不局限与同一个app内的进程中啦。而安卓的ipc机制底层又是基于Binder的所以广播发送者、广播接收者、ASM之间就通过Binder联系起来啦!
由于四大组件的启动都牵涉到ASM所以,我们启动广播也是离不开他的,ASM便可根据发送者的要求在安卓的注册列表中寻找合适的广播(寻找依据: 广播的权限、intent filter 内的匹配规则)
注册广播
注册广播接收器有两种方式:静态注册和动态注册。
静态注册:
在AndroidMainfest文件中声明即可,属性如下:
<receiver
android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
//继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
android:process="string" >
//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNETIVITY_CHANGE"/>
</intent-filter >
</receiver>
静态注册,在App首次启动并会实例化BroadcastReceiver类,同时广播接受器也会注册到AMS中。也就是说App一启动会回调onReceiver方法。提升广播的优先级可在intent-filter中设置属性priority,值越大优先级就越高。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
</intent-filter>
</receiver>
动态注册:
使用Content的registerReceiver方法注册
public abstract Intent registerReceiver(BroadcastReceiver receiver,
IntentFilter filter, @Nullable String broadcastPermission,
@Nullable Handler scheduler, @RegisterReceiverFlags int flags);
上面是registerReceiver方法中最多参数的一个,其中receiver和filter必传的,其他是可选
receiver:用于处理接受到的广播,即广播接收器
filter:意图过滤器,可设置广播的优先级及接受广播类型。
broadcastPermission:设置广播的权限,即发送的广播意图(Intent)必须含有相同的字符串。可选
scheduler:设置广播接受器接受处理消息的所在线程(onReceiver),可选,默认是在主线程
flags:一些附加标志选项,可选
//注册广播
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
//必须action的匹配规则,否则无法接收到消息,在发送广播的意图中必须匹配action的字符串
filter.addAction("test");
registerReceiver(mReceiver,filter);
//发送广播
Intent intent = new Intent();
intent.setAction("test");
sendBroadcast(intent);
有注册,必然就会注销,一般onDestroy或者onPause中注销,如果不注销会引起内存泄漏
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
两种注册方式的区别:
广播的分类
使用方式角度
1、 普通广播:这种广播可以依次传递给各个处理器去处理
2、 有序广播:这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除
3、 粘性消息:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。粘性广播是一种持久化的广播,只要不被主动移除,发送后会长期存储在系统内存。
发送者角度
-
普通广播(Normal Broadcast)
-
系统广播(System Broadcast)
在Android系统内置很多系统广播,当系统状态信息发生了改变,便会发出相应的广播,比如开机、电量变化、网络变化……前面我们知道了在注册和发送广播需要相同的action,而系统广播同样有不同的action,Android系统广播action如下:
-
有序广播(Ordered Broadcast)
同一时刻同一条广播被一个广播接收器接收到这条消息后,必须先执行完当前广播接收器的业务逻辑后,才会继续传递广播。是有先后顺序接收的,接收规则如下:
在默认情况下,相同的注册方式下,会按照注册顺序先后接收
按照Priority属性值从大到小排序
Priority属性值相同者,动态注册的广播优先。
如果某条广播被中断了,后面的广播接收器将无法收到广播
-
粘性广播(Sticky Broadcast)
-
App应用内广播(Local Broadcast)
二、BroadcastReceiver相关类
BroadcastReceiver
BroadcastReceiver类是Android中的一个基础类,用于接收和处理广播消息。当应用程序发送广播时,BroadcastReceiver类可以接收到这些广播,并执行相应的操作。为了使用BroadcastReceiver类,需要创建一个继承自BroadcastReceiver的子类,并重写onReceive()方法。在onReceive()方法中,可以定义接收到广播后的操作。
BroadcastReceiver文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastReceiver.java
BroadcastReceiver定义:
public abstract class BroadcastReceiver {
public static class PendingResult {}
}
BroadcastReceiver 方法:
final void abortBroadcast():设置指示该接收器应当中止当前广播的标志; 仅适用于通过Context.sendOrderedBroadcast发送的广播。
final void clearAbortBroadcast():清除指示该接收机应中止当前广播的标志。
final boolean getAbortBroadcast():返回指示此接收器是否应中止当前广播的标志。
final boolean getDebugUnregister():返回给定的最后一个值为 setDebugUnregister(boolean) 。
final int getResultCode():检索当前结果代码,由前一个接收器设置。
final String getResultData():检索当前结果数据,由前一个接收器设置。
final Bundle getResultExtras(boolean makeMap):检索当前结果的额外数据,由前一个接收器设置。
final BroadcastReceiver.PendingResult goAsync():这可以由 onReceive(Context, Intent)的应用程序调用,以允许它在从该函数返回后保持广播活动。
final boolean isInitialStickyBroadcast():如果接收者当前正在处理粘性广播的初始值(即,上次广播的值并且当前保存在粘性缓存中),则返回true,因此这不是直接由广播产生的结果。
final boolean isOrderedBroadcast():如果接收者当前正在处理有序广播,则返回true。
abstract void onReceive(Context context, Intent intent):当BroadcastReceiver正在接收Intent广播时调用此方法。
IBinder peekService(Context myContext, Intent service):为已经运行的服务提供一个绑定。
final void setDebugUnregister(boolean debug):控制对 Context.registerReceiver()不匹配的调用包含调试帮助。
final void setOrderedHint(boolean isOrdered):对于内部使用,设置有关此BroadcastReceiver是否以有序模式运行的提示。
final void setResult(int code, String data, Bundle extras):更改从此广播返回的所有结果数据; 仅适用于通过Context.sendOrderedBroadcast发送的广播。
final void setResultCode(int code):更改此广播的当前结果代码; 仅适用于通过Context.sendOrderedBroadcast发送的广播。
final void setResultData(String data):更改此广播的当前结果数据; 仅适用于通过Context.sendOrderedBroadcast发送的广播。
final void setResultExtras(Bundle extras):更改此广播的当前结果附加内容; 仅适用于通过Context.sendOrderedBroadcast发送的广播。
BroadcastOptions
BroadcastOptions是Android中用于发送广播时的可选参数。它可以用来设置广播的一些特性,例如是否是交互式广播、是否排除已停止的应用程序等。
BroadcastOptions文件路径:
frameworks/base/core/java/android/app/BroadcastOptions.java
BroadcastOptions定义:
public class BroadcastOptions extends ComponentOptions {}
BroadcastResponseStats
BroadcastResponseStats是一个用于跟踪广播响应统计信息的类。它提供了一些方法和属性来获取广播响应的相关信息。
BroadcastResponseStats文件路径:
frameworks/base/core/java/android/app/usage/BroadcastResponseStats.java
BroadcastResponseStats定义:
public final class BroadcastResponseStats implements Parcelable {}
BroadcastResponseStatsList
BroadcastResponseStatsList是一个类,用于存储广播响应的统计信息列表。
BroadcastResponseStatsList文件路径:
frameworks/base/core/java/android/app/usage/BroadcastResponseStatsList.java
BroadcastResponseStatsList定义:
public final class BroadcastResponseStatsList implements Parcelable {}
BroadcastQueue
BroadcastQueue是Android系统中用于处理广播的队列。当应用程序发送广播时,系统会将广播放入相应的BroadcastQueue中进行处理。每个BroadcastQueue都有一个处理广播的线程,该线程按照广播的优先级和顺序依次处理广播。
BroadcastQueue文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
BroadcastQueue定义:
public final class BroadcastQueue {
private final class BroadcastHandler extends Handler {}
}
BroadcastDispatcher
BroadcastDispatcher是Android系统中的一个类,用于处理广播的分发和调度。负责将广播发送给相应的广播接收者,并根据广播的类型和优先级进行排序和处理。
BroadcastDispatcher文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastDispatcher.java
BroadcastDispatcher定义:
public class BroadcastDispatcher {
static class Deferrals {}
class Dumper {}
static class DeferredBootCompletedBroadcastPerUser {}
}
BroadcastRecord
BroadcastRecord是一个用于存储广播事件信息的对象。它包含了广播事件的相关属性和数据,以便在系统中进行广播的处理和传递。
BroadcastRecord文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastRecord.java
BroadcastRecord定义:
final class BroadcastRecord extends Binder {}
BroadcastFilter
BroadcastFilter是一个用于过滤广播的对象。它是广播接收器(Receiver)注册的一个组件,用于指定接收特定类型广播的条件。
BroadcastFilter文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastFilter.java
BroadcastFilter定义:
final class BroadcastFilter extends IntentFilter {}
BroadcastStats
Android BroadcastStats是Android系统中的一个组件,用于跟踪和记录广播的统计信息。它可以帮助开发者了解广播的使用情况,包括广播的发送次数、接收者的数量和响应时间等。
BroadcastStats文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastStats.java
BroadcastStats定义:
public final class BroadcastStats {
static final class ActionEntry {}
static final class PackageEntry {}
static final class ViolationEntry {}
}
BroadcastConstants
Android BroadcastConstants是一个包含广播相关常量的类。它定义了一些用于广播操作的常量值,例如广播的动作、广播的优先级等。通过使用这些常量,开发人员可以更方便地进行广播操作。
BroadcastConstants文件路径:
frameworks/base/services/core/java/com/android/server/am/BroadcastConstants.java
BroadcastConstants定义:
public class BroadcastConstants {
class SettingsObserver extends ContentObserver {}
}
三、Broadcast相关流程分析
sendBroadcast 流程分析
Android13 Context sendBroadcast流程分析-CSDN博客
sendOrderedBroadcast 流程分析
Android13 Context sendOrderedBroadcast流程分析-CSDN博客