BroadcastReceiver广播相关 - 转
BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播。
一.注册广播
在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者。要写一个类来继承BroadcastReceiver,并且重写其onReceive()方法,实现接收到特定广播所要做的事情。
这是一个自定义的广播接收者:
public class MyBroadCastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//在这里可以写相应的逻辑来实现一些功能
//可以从Intent中获取数据、还可以调用BroadcastReceiver的getResultData()获取数据
}
}
我们已经定义好了一个广播接收者。要想使用它接受到广播,就要注册这个广播接收者。
有两种方式注册广播:
(1)代码中动态注册
步骤如下:
- 实例化自定义的广播接收者
- 实例化意图过滤器,并设置要过滤的广播类型(如,我们接收收到短信系统发出的广播)
- 使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注册广播
代码:
//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注册广播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);
(2)在Manifest.xml中静态注册
直接在Manifest.xml文件的<application>节点中配置广播接收者。
<receiver android:name=".MyBroadCastReceiver">
<!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
还要在<application>同级的位置配置可能使用到的权限
<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>
(3)两种注册广播的不同
- 第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
- 第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
二.发送广播
当我们需要发送一个自定义的广播来通知程序中其他组件一些状态时,就可以使用发送一条广播的方式。
有两种方式分别发送两种不同的广播:
通过mContext.sendBroadcast(Intent)或mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。
区别:
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。
(1)无序广播的使用:
定义一个按钮,设置其点击事件,发送一个无序广播。
Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
sendBroadcast(intent);
定义一个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播", Toast.LENGTH_SHORT).show();
}
}
在Manifest.xml中配置该接收者。
<receiver
android:name=".MyReceiver" >
<intent-filter>
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
运行结果为:Toast打印出 “收到广播”。
(2)有序广播的使用
和无序广播使用不同的是 通过 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。
定义一个按钮,设置其点击事件,发送一个有序广播。
Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
//第一个参数:intent
//第二个参数:String类型的接收者权限
//第三个参数:BroadcastReceiver 指定的接收者
//第四个参数:Handler scheduler
//第五个参数:int 此次广播的标记
//第六个参数:String 初始数据
//第七个参数:Bundle 往Intent中添加的额外数据
sendOrderedBroadcast(intent, null, null, null, "这是初始数据", );
定义多个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1() {
}
@Override
public void onReceive(Context context, Intent intent) {
//获取广播中的数据(即得到 "这是初始数据" 字符串)
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//修改数据
setResultData("这是修改后的数据");
}
}
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();
}
}
public class MyReceiver3 extends BroadcastReceiver {
public MyReceiver3() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
}
}
在Manifest.xml中配置该接收者。并设置优先级:MyReceiver1>MyReceiver2>MyReceiver3。
<!-- 优先级相等的话,写在前面的receiver的优先级大于后面的 -->
<receiver
android:name=".MyReceiver1" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="1000">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="0">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver3" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="-1000">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
运行结果:MyReceiver1得到广播数据后打印“这是初始数据”,MyReceiver2接收到广播数据打印“这是修改后的数据”,MyReceiver3没有打印。
BroadcastReceiver广播相关 - 转的更多相关文章
- Android 学习笔记 BroadcastReceiver广播...
PS:不断提升自己,是件好事... 学习内容: 1.BroadcastReceiver的使用.. 2.通过BroadcastReceiver去启动Service... 1.BroadcastRecei ...
- Android的BroadcastReceiver 广播 短信拦截
如何去理解BroadcastReceiver(广播)?其实可以这样想,首先我们要有一个发送广播的"媒体",在这个例子中,我们暂且用activity组件作为这个媒体,当然以后会用到s ...
- Android组件系列----BroadcastReceiver广播接收器
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android开发——BroadcastReceiver广播的使用
想要了解广播定义及相关原理的可以看下这一篇BroadcastReceiver史上最全面解析 简单地对广播进行分类吧,广播有两个角色,一个是广播发送者,另外一个是广播接收者 广播按照类型分为两种,一种是 ...
- BroadcastReceiver广播接受者
广播接收器的两种注册方式: 1)动态注册:在代码中注册,创建一个IntentFilter(意图过滤器)对象,设置想要就收的广播,在onCreate()方法中通过调用registerReceiver() ...
- Android中BroadcastReceiver广播
BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadca ...
- Android BroadcastReceiver广播接受者
静态注册 配置清单表注册:只要曾经注册过哪怕关闭也能调用 方式一:sendBroadCastReceive 广播的步骤: 发送 无序广播,普通广播 (1).发送方 ...
- Android四大组件之一:BroadCastReceiver(广播接收者)
广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...
- BroadcastReceiver广播接受者简单使用
1.注册BrocadcastReceiver <receiver android:name=".FirstReceiver" > <!-- 指定能够接收的广播类型 ...
随机推荐
- python 版本升级
python 版本升级 升级python 查看python的版本 python -V Python 2.6.6 下载新版本 wget https://www.python.org/ftp/python ...
- 用例设计之API用例覆盖准则
基本原则 本文主要讨论API测试的用例/场景覆盖,基本原则如下: 用户场景闭环(从哪来到哪去) 遍历所有的实现逻辑路径 需求点覆盖 覆盖维度 API协议(参数&业务场景) 中间件检查 异常场景 ...
- [转载]Buffer cache的调整与优化
Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的free buffer waits事件.下面将具体描 ...
- 使用MonkeyTest对Android客户端进行压力测试
目录 monkey命令简介 monkey命令参数说明 自动化实例 如何通过日志定位问题 1.monkey命令简介 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它 ...
- Oracle EBS AP 供应商API
--创建供应商地址上的电话号码 created by jenrry 20170419 DECLARE l_return_status VARCHAR2(1); l_msg_count NUMBER; ...
- mariadb使用\s查看用户权限
今天出现一个问题就是:给zabbix用户赋予权限 语句如下: grant all on zabbix.* to 'zabbix'@'%' identified by 'zabbix' 按照这样的说法应 ...
- django中url 和 path 的区别
django中 url 和 path 都是配置路径,有什么不同? django.urls path django.conf.urls url path 与 url 是两个不同的模块,效果都是响应返回 ...
- 51nod 贪心算法题集
2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...
- 51nod 1636 教育改革
题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...
- 快速数论变换(NTT)
刚学完FFT,干脆把NTT也学了算了 (一)预备知识 关于原根,这里说得蛮详细的百度百科 为什么使用原根呢?为什么原根可以替代\(\omega_{n}\)呢?想知道为什么就看here NTT用到的各种 ...