Android-13-BroadcastReceiver(广播接收者)

Posted 木白星枝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-13-BroadcastReceiver(广播接收者)相关的知识,希望对你有一定的参考价值。

1.简介:

       广播是一种运用在应用程序之间传递消息的机制,例如电池电量低时会发送一条提示广播。要过滤并接收广播中的消息就需要使用BroadcastReceiver(广播接收者),广播接收者是android四大组件之一,通过广播接收者可以监听系统中的广播消息,并实现在不同组件之间的通信。
        Android系统提供了一个BroadcastReceiver组件,该组件可以监听来自系统或者应用程序的广播。当Android系统产生一个广播事件时,可以有多个对应的BroadcastReceiver接收并进行处理,这些广播接收者只需要在清单文件或者代码中进行注册并指定要接收的广播事件,然后创建一个类继承自BroadcastReceiver类,重写onReceive()方法,在方法中处理广播事件即可。

2.广播接收者的注册方式

 (1)静态注册:创建一个广播接收者,并在清单文件中完成注册,在新建Other中选择新建Broadcast Receiver,Exported复选框用于选择是否接收当前程序之外的广播,Enabled复选框用于选择广播接收者是否可以由系统实例化,两个选项默认勾选即可,选项内容会在清单文件中显示。

        在上述代码中,创建的MyReceiver继承自BroadcastReceiver,默认包含一个构造方法和一个onReceive()方法。其中onReceive()方法用于实现广播接收者的相关操作,由于该方法尚未实现,因此会抛出异常,在实现该方法时删除异常即可。
(2)动态注册:创建一个广播接收者,并在Activity中通过代码进行注册,动态注册的广播接收者的生命周期依赖于注册广播的组件,例如在Activity 中注册了广播接收者,当Activity销毁时,广播接收者也随之被移除。

在上述代码中,首先创建广播接收者实例,然后实例化过滤器,设置要过滤的广播类型。并通过registerReceiver()方法进行注册,其中参数intenfilter是接收监听的广播事件。最后在onDestroy(方法中,通过unregisterReceiver()方法将其销毁。
(3)样例:

getResultData()方法可以获得外拨的电话号码,首先输入要拦截的电话号码,使用SharedPreferences存进去,然后在Receiver中,取出要拦截的号码和获取到的电话号码进行比较。

当输入完电话号码拨打电话时,Android 系统会发送一个广播(android.intent.action.NEW_OUTGOING_CALL)给电话拨号器的广播接收者,因此,想要拦截生效,就需要在AndroidManifest.xml文件中注册广播接收者,来拦截外拨电话的广播,由于外拨电话涉及权限问题,所以还需要在清单文件中添加相应的权限.

在上述代码中,注册了OutCallReceiver 广播接收者,通过拦截系统外拨打电话的广播( "android.intent action.NEW OUTGOING CALL" ),这样当手机向外拨打电话时,OutCallReceiver就能在系统电话拨号器的广播接收者接收到电话号码之前将其清空。至此,电话拦截的程序就完成了.

3.自定义广播

(1)Android系统中自定义了很多广播类型,只需要创建对应的广播接收者接收即可。当系统提供的广播不能满足实际需求时,可以自定义广播,同时需要编写对应的广播接收者。

如图所示,当自定义广播发送消息时,会储存到公共消息区中,而公共消息区中如果存在对应的广播接收者,就会及时地接收这条信息。

(2)样例:

在Activity中首先创建一个Intent对象,通过setAction()方法定义广播的类型(类型名称是自定义的,该名称必须与清单文件中注册自定义广播接收者的类型名称一致),最后通过 sendBroadcast()方 法将广播发送出去。

当MyBroadcastReceiver接收到广播时就会在LogCat中输出这些信息。

自定义的广播接收者MyBroadcastReceiver成功地接收了发送的广播消息,并在LogCat中输出了对应的广播事件。需要注意的是,自定义广播的类型与广播接收者在清单文件中配置的类型要一致, 否则无法接收到广播。

4.广播的类型

(1)无序广播是完全异步执行的,发送广播时,所有监听这个广播的广播接收者都会接收到此广播消息,但接收和执行的顺序不确定。无序广播的效率比较高,但无法被拦截。

(2)有序广播是按照接收者声明的优先级别被依次接收,发送广播时,只会有一个广播接收者能够接收此消息,当在此广播接收者中逻辑执行完毕之后,广播才会继续传递。相比无序广播,有序广播的效率较低,但此类型是有先后顺序的,并可被拦截。

在清单文件注册广播接收者时,可在<intent-filter>标签中 使用priority 属性设置优先级别,例如<intent-flter android:priority="100">,属性值越大优先级越高。如果两个广播接收者的优先級相同,则先注册的广播接收者优先级高。两个程序监听了同一个广播事件,同时都设置了优先级属性,则先安装的程序优先接收。

(3)样例:

在上述代码中,通过sendOrderedBroadcast()方法发送一条有序广播,此方法中接收2个参数,第1个参数是意图对象,设置发送的广播事件“Intercept _Stitch"。 第2个参数指定接收者的权限,此案例不关心权限问题,填写为“null" 即可。

然后创建3个广播接收者,

优先级高的最先接收。

拦截了广播。

以上是关于Android-13-BroadcastReceiver(广播接收者)的主要内容,如果未能解决你的问题,请参考以下文章