广播接收者BroadcastReceiver(2018年5月18日)

前提知识

ContextCompat上下文兼容

ContextCompat.getDrawable
ContextCompat.getColor

替代
context.getResources().getDrawable
context.getResources().getColor

import android.Manifest;

Manifest.permission.RECEIVE_SMS



1、广播接收者

BroadcastReceiver

使用场景:

当手机没有电时,会告知用户“电量低”的广播信息。可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源。

对于某某程序来说,可以选择接收这一消息也可以选择不接收这个消息。

手机的storage不够了,提示你清理空间,否则应用程序将变慢或者无法使用。

手机一开机,某某程序就自动运行,QQ、微信都是开机自启。

原理:

一个程序发出广播信息,一个程序接收广播信息,所以至少需要2个程序才能完成一发一收。发的一方,叫广播发送方;收的一方,叫广播接收者。

例如使用receiver可以接收短信拦截它。

如何实现:

1)接收什么广播

是指广播的消息是什么,需要接收者关注什么广播频道

2)接收到广播后做什么?

重写onReceive()方法,表示收到广播就做什么

3)需要定义一个继承于BroadcastReceiver的类。

【案例】收到短信,响应它。

步骤:

1)继承BroadcastReceiver,重写onReceive方法

2)注册BroadcastReceiver,且设置广播的action

3)权限的设置,分为动态权限和静态权限

项目结构:

 

MyReceiver.java

 

AndroidManifest.xml

 

MainActivity.java

 

测试:

 

Log日志:

 

2、有关广播接收者的分类

有关广播:按是否有序分类:有序广播和无序广播

有序广播是指:接收者A收到广播后传给BB传给C,有序传递。任何一个环节都可以终止广播,也可以修改广播中携带的数据。

发送广播的方法是:sendOrderedBroadcast()

无序广播是指:一个广播发送者,向所有接收者同时发送广播,也就是ABC接收者都同时响应。

发送广播的方法是:sendBroadcast()

有关广播接收者:按是否常驻分类:常驻型广播接收者和非常驻型广播接收者

常驻型广播接收者:在androidManifest.xml中注册,只要应用程序没有被卸载就持续存在。

非常驻型广播接收者:在java代码中注册,一般随Activity或者Service组件产生而产生,随他们销毁而销毁。生命周期比较短。使用的方法是registerReceiver(参数1:广播接收者实例,参数2:频道(意图过滤器));unregisterReceiver(广播接收者实例)

3、如何发送广播?

实现的步骤:

1)需要设置一个意图,意图中包含广播的频道,也就是有action,这个action相当于广播中的频道,关联了收和发广播双方,发从什么频道发出去,收从什么频道接收来。

2)使用sendBroadcast(intent),表示发送广播。

Sender Module

 

activity_main.xml

MainActivity.java

 

Receiver Module:

 

MyReceiver.java

 

androidManifest.xml

 

效果:

点击

receiver中显示日志

日志为:

4、如何发送有序广播?

有序广播,又叫同步广播,接收者依次收到广播,这个顺序取决于接收者在注册时设置priority(优先级),该数字越大表示优先级越高,代表越先收到广播。有序广播对于接收者来说,效率较低,因为有先后顺序。

无序广播,异步执行,各自执行各自的响应,互相不干扰,效率较高。

Sender Module:

修改activity_main.xml

修改MainActivity.java

Receiver Module:

MyOrderedReceiver1.java

MyOrderedReceiver2.java

MyOrderedReceiver3.java

androidManifest.xml

测试:

点击发送有序广播,依次响应。

注意:

1)如果多个接收者priority一样,在前面注册的先接收消息,先做出响应

2)也可以在某个receiver上终止广播,后面的receiver就收不到消息了。使用abortBroadcast()方法。

5、如何在有序广播中传递数据?

发送有序广播时需要指定参数

public abstract void sendOrderedBroadcast(Intent intent, String permission, BroadcastReceiver receiver, Handler handler, int code, String data, Bundle bundle);

intent,通过意图,指定广播的频道

permission,表示必须具备什么权限才能接收的接收者,null表示不需要限定权限

receiver,指定某一个接收必须接收(即使碰到abortBroadcast,也接收)

handler,系统的处理者,实现线程通信

code,表示广播的状态码

data,表示原始数据,可以用于传递数据

bundle,是一组数据,可以包含很多数据

【案例】发送带有数据的广播

sender2 module

 

activity_main.xml:

 

MainActivity.java

 

Receiver2 Module:

 

MyReceiver1.java

 

MyReceiver2.java

 

MyReceiver3.java

 

AndroidManifest.xml

 

效果:

依次收到数据

6、发送有序广播中,修改传递的数据

在接收者中调用setResultDataString)方法对字符串数据进行修改;

在接收者中调用setResultExtra(bundle)方法对bundle数据进行修改

sender3 Module

 

activity_main.xml

 

MainActivity.java

 

Receiver3 Module:

 

MyReceiver1.java

 

MyReceiver2.java

 

MyReceiver3.java

 

androidManifest.xml中注册。

测试如下:

【作业】

实现有序广播及接收者(2个),接收者根据广播信息传递不同数据,如广播消息“没有电了”,接收者1回应“保存数据,完成第一步”,接收者2回应“保存数据,完成第二步”。如果广播消息是“没有信号”,接收者1回应“连接基站,完成第一步”,接收者2回应“连接基站,完成第二步”。

  

原文地址:https://www.cnblogs.com/sanshengshitouhua/p/14581112.html