Android之旅---广播(BroadCast)

什么是广播

         在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了。Android中的广播机制就和这个差不多的道理。

电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent。这个Intent中可以携带我们要传送的数据。

电台通过大功率的发射器发送内容,而在Android中则是通过sendBroadcast这个方法来发送(很形象的名字吧)。       

用户通过调整到具体的电台频率接受电台的内容。而在Android中要接受广播中的内容则是通过注册一个BroadCastReceiver来接收的。只有发送广播的action和接收广播的action相同,接受者才能接受这个广播。
广播有什么用
其实,在什么是广播的第一句就已经说明了广播有什么用了。对了,笼统一点讲就是用来传输数据的。具体一点说就是:
 
1.实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播,只要我们实现了他们的action的广播,那么我们就能接收他们的数据了,以便做出一些处理。比如说拦截系统短信,拦截骚扰电话等等
2.起到了一个通知的作用,比如在service中要通知主程序,更新主程序的UI等。因为service是没有界面的,所以不能直接获得主程序中的控件,这样我们就只能在主程序中实现一个广播接受者专门用来接受service发过来的数据和通知了。
实现广播

         现在我们就来实现一个简单的广播程序。Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中指定。他们之间的区别就是作用的范围不同,程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。首先介绍在程序中动态注册的方式。

动态注册方式

         我们在程序中设置了三个按钮,分别是“注册广播”,“取消注册”和“发送广播”。然后每个按钮设置点击事件来完成广播的演示。

最简单的项目的建立过程和按钮事件的建立我再这里就不罗嗦了,不会的可以下载下面的DEMO源码查看。直接看三个按钮的实现方式。

首先是注册广播的按钮事件代码:

private ReceiveBroadCast receiveBroadCast;  //广播实例public class RegisteLinster implements OnClickListener
{@Overridepublic void onClick(View view){// 注册广播接收receiveBroadCast = new ReceiveBroadCast();IntentFilter filter = new IntentFilter();filter.addAction(flag);    //只有持有相同的action的接受者才能接收此广播registerReceiver(receiveBroadCast, filter);}
}public class ReceiveBroadCast extends BroadcastReceiver
{@Overridepublic void onReceive(Context context, Intent intent){//得到广播中得到的数据,并显示出来String message = intent.getStringExtra("data");txtShow.setText(message);}}

首先我们实现了一个ReceiveBroadCast 类,它继承了BroadcastReceiver并实现了其中的onReceive方法,这样当这个广播被接收的时候就会执行这个方法。注意我们在注册广播的时候使用了filter.addAction方法添加了一个过滤器。如果没有这一句,就相当于广播电台没有告诉咱们收音机用户接收的频率,就不好收听这个广播了。

再来看看如何取消注册,是的程序不再接收这个类型的广播了。

public class UnregisteLinster implements OnClickListener
{@Overridepublic void onClick(View arg0){unregisterReceiver(receiveBroadCast);}
}

怎么样?是不是超级简单的啊,就是将我们上面的那个广播类的实例传进去就行了。现在注册,取消注册都好了,就剩下如何发送了。看代码:

public class SendBroadCastListener implements OnClickListener
{@Overridepublic void onClick(View arg0){Intent intent = new Intent();  //Itent就是我们要发送的内容intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));   intent.setAction(flag);   //设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播sendBroadcast(intent);   //发送广播}
}

每一句都注释了的,就不要我再讲了吧。一看就明白了。现在,运行程序看看效果吧。先注册一下,然后每发送一次广播上面的文字就会变化一次,表明已经接收到了广播了。按取消注册后你可以发现再按发送按钮已经接收不到广播了。

配置文件方式

配置和动态注册的区别在上面已经说了,这种方式适合你的程序需要长期的监测某个广播的情形,比如监测用户的短信。注册方式比较简单,相当于上面的代码只要接收的那部分就行了。不过要注意的是通过配置文件这种方式注册广播需要在单独的一个类中继承BroadReceiver,内部类是没有用的。所以我们新建了一个broadCastReceiveByXml类并继承了BroadReceive。代码如下:

public class broadCastReceiveByXml extends BroadcastReceiver
{@Overridepublic void onReceive(Context arg0, Intent arg1){Log.d("qlf", "broadcast receive by xml");    //因为不在主UI下,不好使用控件,所以我们这里打印到LOG里面查看效果}}

然后在AndroidManifest中的<activity></activity>节点之后我们添加一下代码:

<receiver android:name="com.qlf.broadCast.broadCastReceiveByXml"><intent-filter><action android:name="com.qlf.broadCastFlag"></action></intent-filter>
</receiver>

receiver中的android:name就是我们在程序中的那个接收广播的类。下面的intent-filter和我们讲到的功能类似,而这个action就是上面的那个flag啦。现在我们运行程序,发现同样可以实现上面的功能。运行的结果如下:

14073458

除了使用我们自己发送广播,android也内置了许多广播。比如我们上面提到的来了消息的时候android会发送一个action名为“android.provider.Telephony.SMS_RECEIVED”的广播,这个时候如果我们想要接受这个广播只要将配置文件中的那个action设置为上面这个字符串就能接收到消息信息了。android包括了许多其他的广播action,有兴趣的同学到网上搜搜就有了。这里就不再举例了。

源码下载

       下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python牛客网编程题_【面经】小米软件开发一面(python)面经 2020 2020

作者&#xff1a;JessyTsuihttps://www.nowcoder.com/discuss/580721?type2&order0&pos15&page1&channel-1&source_iddiscuss_tag_nctrack来源&#xff1a;牛客网小米软件开发一面(python)面经一共三轮技术面&#xff0c;第四轮是HR面&#xff0c;已OC&am…

IDS与IPS

IDS是英文“Intrusion Detection Systems”的缩写&#xff0c;中文意思是“***检测系统”。专业上讲就是依照一定的安全策略&#xff0c;对网络、系统的运行状况进行监视&#xff0c;尽可能发现各种***企图、***行为或者***结果&#xff0c;以保证网络系统资源的机密性、完整性…

c# 数组和集合

数组是最为常见的一种结构&#xff0c;是相同类型的、用一个标识符封装到一起的j基本类型数据序列或对象序列&#xff0c;可以用一个统一的数组名和下标来唯一确定数组中的元素。实质上数组是一个简单的线性序列&#xff0c;因此数组访问起来很快。而集合可以看成一种特殊的数组…

和vs版本关系_栈局部变量优化探究,意外发现了 vs 的一个 bug ?

缘起 我在《栈又溢出了》一文中记录了一个奇怪的栈溢出问题。虽然解决了&#xff0c;但是总感觉哪里不太合理。我想&#xff0c;vs 一定有一个合理的设置。一起折腾起来吧&#xff01;查找工程设置 本以为能找到某个编译选项对局部变量占用内存的行为进行控制。看遍了工程设置也…

Visual C++ 时尚编程百例009(响应键盘)

按钮消息WM_KEYDOWN,WM_CHAR,WM_KEYUP在CXXXDoc.h中添加变量CString Text;在构造函数中初始化Cvc1001Doc::Cvc1001Doc(){ // TODO: 在此添加一次性构造代码 Text_T("");}右击CXXXView类->属性->消息->WM_CHARvoid Cvc1001View::OnChar(UINT nChar, UINT nRe…

在ubuntu 16.04上安装tensorflow,并测试成功

用下面代码测试安装&#xff1a; 1 #! /usr/bin/python2 # -*- coding: utf-8 -*-3 4 import tensorflow as tf5 import numpy6 import matplotlib.pyplot as plt7 rng numpy.random8 9 learning_rate 0.01 10 training_epochs 1000 11 display_step 50 12 #数据集x 13 tra…

redis客户端连接数量_实战解析无所不知的Redis拓展应用——Info,进阶学习,无所不能...

前言学习是一个持续的过程。像咱们一直在更新的Redis学习内容&#xff0c;由基础结构&#xff0c;到原理应用&#xff0c;再到集群搭建&#xff0c;了解的够充分了&#xff0c;咱们接着又介绍Redis拓展应用&#xff0c;将知识面拓宽&#xff0c;毕竟技术都是相通的&#xff0c;…

诡异的防火墙故障,能PING通,但访问ORACLE不稳定

上周四我们的IDC核心数据区到DMZ区的防火墙经历了十分诡异的故障。 虽然我从一开始就断定非ORACLE问题&#xff0c;因为连接核心数据区的多个ORACLE数据库的应用都无一例外的出现了相同的问题&#xff0c;如果三个以上ORACLE能同时出想这么严重的问题&#xff0c;那么我想ORACL…

【Excle数据透视】如何用含有单元格的数据来创建数据透视

取消合并单元格&#xff0c;填充相同内容项&#xff0c;然后创建数据透视表. 如下图&#xff1a;需要使用数据创建数据透视表 步骤一 开始→格式刷&#xff0c;然后对单元格区域G2&#xff1a;G15使用格式刷功能&#xff0c;保留合并单元格格式 步骤二 选中A2&#xff1a;A18区…

css 超出文字头尾相接滚动_前端的一些雕虫小技,从100%和滚动条说起

1、100%和滚动条当我们在css中把html和body同时设为100%时&#xff0c;会出现滚动条html,body {width: 100%;height: 100%;}原因是html和body之间有8px的margin&#xff0c;这个margin怎么来的呢&#xff0c;我们在chrome中用F12看一下这个8px的margin来自于user agent stylesh…

[转] C# 路径(目录)

一、获取当前文件的路径1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName获取模块的完整路径&#xff0c;包括文件名。2. System.Environment.CurrentDirectory获取和设置当前目录(该进程从中启动的目录)的完全限定目录。3. System.IO.Directory.GetCur…

《大鱼海棠》

我告诉你什么事最可悲&#xff0c;你遇见一个人&#xff0c;犯了一个错&#xff0c;你想弥补想还清&#xff0c;到最后才发现&#xff0c;你根本无力回天&#xff0c;犯下的罪过永远无法弥补转载于:https://www.cnblogs.com/ting6/p/9726163.html

class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶

人生苦短&#xff0c;我用 Python如果我的文章对您有帮助&#xff0c;请关注支持下作者的公众号&#xff1a;极客挖掘机&#xff0c;您的关注&#xff0c;是对小编坚持原创的最大鼓励&#xff1a;)前文传送门&#xff1a;小白学 Python 爬虫(1)&#xff1a;开篇小白学 Python 爬…

shellcode

Shellcode实际是一段代码&#xff08;也可以是填充数据&#xff09;&#xff0c;是用来发送到服务器利用特定漏洞的代码&#xff0c;一般可以获取权限。 另外&#xff0c;Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心&#xff0c;提到它…

小学生都能看懂的FFT!!!

小学生都能看懂的FFT&#xff01;&#xff01;&#xff01; 前言 在创新实践中心偷偷看了一天FFT资料后&#xff0c;我终于看懂了一点。为了给大家提供一份简单易懂的学习资料&#xff0c;同时也方便自己以后复习&#xff0c;我决定动手写这份学习笔记。 食用指南&#xff1a; …

ComboBox自动补全小技巧

网上看的自动补全实在是太麻烦&#xff0c;有时候还用到了第三方控件&#xff0c;但是现在我的需求是这样的 有一个Person类&#xff0c;其中有Code、Name两个属性 Person需要绑定到ComboBox中&#xff0c;在ComboBox中输入Code时&#xff0c;即自动补全相应的Name 想了半天&am…

可做fft分析吗_小吃店生意好做吗,小吃业行情分析

现在创业已经成为一种风尚&#xff0c;不少创业者都打算开一家小吃店&#xff0c;现在小吃店的生意好做吗&#xff1f;开小吃店有没有前景呢&#xff1f;中国人一直以来都非常看重“吃”&#xff0c;民以食为天&#xff0c;食物就是中国人生存的灵魂所在。基本上每个城市、每个…

SVN版本回滚

新入职的公司居然还是用的SVN管理代码&#xff0c;需要版本回滚&#xff0c;弄了半天&#xff0c;顺便记录一下。 当前的最新版本号是1470&#xff0c;其中1467到1470这几个提交都要被移除时&#xff0c;在项目文件夹下使用下面的代码&#xff1a; svn merge -r 1470:1466 . 这…

ase加密放linux报错_Linux应用安装有福啦!和苹果Mac一样方便的单文件安装

自从用了苹果macbook&#xff0c;和windows基本上就再见了&#xff0c;苹果系统的稳定性太出色了&#xff0c;使用完合上盖子放十天半个月的没一点问题&#xff0c;一叫就醒&#xff0c;一醒就能接着工作&#xff0c;windows系统不行&#xff0c;要么睡了叫不醒&#xff0c;要么…

我的软考之路——软考心得

软考&#xff1f;是什么东西&#xff0c;可能大多数人跟我一样&#xff0c;刚听到这个词语觉得很陌生&#xff0c;但当我走进社会&#xff0c;面临到工作的压力&#xff0c;要求自己必须学习进步的时候&#xff0c;认识了它! 那时候参加工作也几年了&#xff0c;工作的压力是…