开发者社区> 一叶飘舟> 正文

Android广播机制

简介:
+关注继续查看

一、Android广播机制介绍

广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。

Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,并且广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试是否收到短信,这时候就可以定义一个BraodcastReceiver来接受广播,当收到短信时提示用户。我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。

我们也可以在自己的应用程序中开发BroadcastReceiver,然后把广播接收器这个类或者对象注册到Android操作系统上去,让操作系统知道现在有这样一个广播接收器正在等待接收Android操作系统的广播,即在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。

当有广播事件产生时,Android操作系统首先告诉注册到其上面的广播接收器产生了一个怎么样的事件,每个接收器首先判断是不是我这个接收器需要的事件,如果是它所需要的事件,再进行相应的处理。

例子,我们把骚扰电话的黑名单放到数据库中去,当接到电话时会产生一个接电话事件,事先在Android操作系统中注册一个BroadcastReceiver的对象,当产生事件的时候,会通知我们的广播接收器对象,接收器对象接收到消息之后,就会到数据库里面去取所有黑名单电话和接到的这个电话号码进行比较,如果匹配就直接挂掉。

二、注册BroadcastReceiver的方法

BroadcastReceiver用于监听被广播的事件(Intent),为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:

1.静态注册

静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。

静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听。

[html] view plaincopy
  1. <receiver android:name="MyReceiver">  
  2.     <intent-filter>  
  3.         <action android:name="MyReceiver_Action"/>  
  4.     </intent-filter>  
  5. </receiver>  
其中,MyReceiver为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。<intent-filter>标签设置过滤器,接收指定action广播。

2.动态注册

动态注册方式在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。

动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

[java] view plaincopy
  1. MyReceiver receiver = new MyReceiver();  
  2. //创建过滤器,并指定action,使之用于接收同action的广播  
  3. IntentFilter filter = new IntentFilter("MyReceiver_Action");  
  4. //注册广播接收器  
  5. registerReceiver(receiver, filter);  
三、发送广播

[java] view plaincopy
  1. // 指定广播目标Action  
  2. Intent intent = new Intent("MyReceiver_Action");  
  3. // 可通过Intent携带消息  
  4. intent.putExtra("msg""发送广播");  
  5. // 发送广播消息  
  6. sendBroadcast(intent);  
四、注销BroadcastReceiver

[java] view plaincopy
  1. //注销广播接收器  
  2. unregisterReceiver(receiver);  

注:

1.一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver。

2.一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
说说Android的广播(3) - 什么样的广播是并发的?
现在让我们开始破解Android中的一个trick,普通广播都是并发的吗? 带着这个问题,我们来看ActivityManagerService.broadcastIntentLocked中的实现逻辑。
2380 0
Android利用广播监听设备安装和卸载应用程序
MainActivity如下: package cn.testappaddandremove; import android.os.Bundle; import android.
921 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14237 0
Android复习--广播
广播有两种方式,一种静态广播,一种动态广播。 静态广播-->静态广播接收器在配置文件里面注册。 动态广播-->而动态广播接收器在代码里面注册。 广播的发送: Context.sendBroadCast(); Context.sendOrderedBroadCast(); Context.sendStickyBrodcast(); 一个广播可以本多个广播接受者所接收。
637 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23546 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20365 0
Android在广播接收者中弹出对话框
在广播中弹出对话框与在Activiity中弹出对话框有所不同,在Activiity中弹出对话框,我们需要用到当前Activiity的Context,而在广播中并没有,如果一定要在广播中弹出一个对话框,我需要定义这个对话框是一个系统级别的。
1076 0
+关注
1635
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载