什么是广播

在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源码查看。直接看三个按钮的实现方式。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private ReceiveBroadCast receiveBroadCast;  //广播实例
 
public class RegisteLinster implements OnClickListener
{
        @Override
        public void onClick(View view)
        {
            // 注册广播接收
            receiveBroadCast = new ReceiveBroadCast();
            IntentFilter filter = new IntentFilter();
            filter.addAction(flag);    //只有持有相同的action的接受者才能接收此广播
            registerReceiver(receiveBroadCast, filter);
        }
}
 
public class ReceiveBroadCast extends BroadcastReceiver
{
 
        @Override
        public void onReceive(Context context, Intent intent)
        {
            //得到广播中得到的数据,并显示出来
            String message = intent.getStringExtra("data");
            txtShow.setText(message);
        }
 
}

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

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

1
2
3
4
5
6
7
8
9
public class UnregisteLinster implements OnClickListener
{
 
        @Override
        public void onClick(View arg0)
        {
            unregisterReceiver(receiveBroadCast);
        }
}

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

1
2
3
4
5
6
7
8
9
10
11
public class SendBroadCastListener implements OnClickListener
{
        @Override
        public 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。代码如下:

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

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

1
2
3
4
5
6
<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啦。现在我们运行程序,发现同样可以实现上面的功能。运行的结果如下:

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

http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html

Android之旅---广播(BroadCast)的更多相关文章

  1. Android 中的广播(Broadcast)

    Android 广播(broadcast) 饮水思源 本文章内容学习和总结自 郭霖大神:<Android第一行代码> Overview 就像我们的学校里的喇叭一样,是用来通知的.而Andr ...

  2. Android中的广播Broadcast详解

    今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低.开机.锁屏等一些操作都会发送 ...

  3. Android为什么需要广播Broadcast

       在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它 ...

  4. Android学习笔记--广播(Broadcast)

    1.Android广播分类 android的广播类型分为两类:标准广播和有序广播. 标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播.打个比方:做地铁过程中的语音播报,当列车 ...

  5. Android广播Broadcast

    Android Broadcast简单认识 Broadcast是应用程序间传输信息的一种机制,BroadcastReceiver是对发送出来的广播(Broadcast)进行过滤并接收相应的一类组件. ...

  6. 入职小白随笔之Android四大组件——广播详解(broadcast)

    Broadcast 广播机制简介 Android中的广播主要可以分为两种类型:标准广播和有序广播. 标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播 ...

  7. android四大组件之Broadcast

    广播的概念 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件.Androi ...

  8. Android实现AppWidget、Broadcast静态注册

    Android实现AppWidget.Broadcast静态注册 本篇博客是基于我上一篇博客继续修改的,详情请看Android实现AppWidget.Broadcast动态注册 开发工具:Andori ...

  9. Android实现AppWidget、Broadcast动态注册

    Android实现AppWidget.Broadcast动态注册 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 主界面可以编辑广播的信息,点 ...

随机推荐

  1. unindent does not match any outer indentation level

    报错原因: 空格与tab键混用,一般粘贴代码时会出现 解决方法: 把所有缩进取消,然后用tab键来缩进

  2. mac 文本编辑器 文本编码Unicode utf-8 不适用的问题

    在mac上使用默认的文本编辑器打开下载的xx.txt文件,如果文本是gbk的编码可能会出现 文本编码Unicode utf-8 不适用的打开错误,如下图 解决方式: 文本编辑---偏好设置-----打 ...

  3. html 通用 遮罩弹出层 弹出后 支持跳转页面

    //showMessage 提示的内容默认为空必填 buttonText:按钮显示的内容默认为"确定" 传入 "" 为默认 url:跳转链接 传入"& ...

  4. Chinese culture

      文房四宝 笔墨纸砚是中国古代文人书房中必备的宝贝,被称为“文房四宝”.用笔墨书写绘画在 中国可追溯到五千年前.秦(前221---前206)时已用不同硬度的毛和竹管制笔:汉代(前206—公元220) ...

  5. linux下多路复用模型之Select模型

    Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...

  6. CentOS 下 rpm包与 yum 安装与卸载

    rpm包的安装:      1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.移走一个包 # rpm -e 4.安装参数 --force 即使覆盖属于其它包的文件也强迫安 ...

  7. BZOJ4046 [Cerc2014] Pork barre

    我们把边按权值从大到小依次加入图中 如果加到边权$V$,则当前的最小生成森林中边权$v\in[V, V']$(其中$V'$是任意值)形成的森林的边权和就是对于询问$[V, V']$的答案 由于点数不多 ...

  8. 《算法竞赛入门经典》5.41数学基础-Cantor的数表

    如下数列,第一项是1/1,第二项是1/2,第三项是2/1,第四项是3/1,第五项是2/2,…….输入n,输出第n项.1/1   1/2   1/3   1/4   1/52/1   2/2   2/3 ...

  9. sql float 转换为 nvarchar

    INSERT INTO CC11 SELECT convert(nvarchar(30),convert(decimal(11,0),PCTID)),convert(nvarchar(30),conv ...

  10. Android - 动态调整ListView高度

    布局中,如果设计ListView的高度为包裹内容,那么ListView的高度是随着它的子条目的数量的变化而改变的, 这就可能会导致ListView下面的一些控件的位置也会随着ListView的高度的变 ...