Android开发22——广播接收者BroadcastReceiver的原理和注册方式

简介:

一、广播机制的基本概念

当某个事件产生时(如一条短信发来或一个电话打来),android操作系统会把这个事件广播给所有注册的广播接收者,需要处理这个事件的广播接收者进行处理。其实这就是日常生活中的广播。发生一个新闻后,广播电台会广播这个新闻给打开收音机的人,对这个新闻感兴趣的人会关注,可能会拿笔记下。新闻就是事件,广播电台就是android系统,打开收音机的人就是广播接收者,感兴趣的人就是需要处理该事件的广播接收者,拿笔记下就是对该事件进行的操作。

 


二、广播的分类——普通广播和有序广播

①普通广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。


②有序广播:按照被接收者的优先级顺序,在被接收者中一次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权中终止广播,比如B终止广播,C就无法接收到。此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中取得A存入的数据。如系统收到短信发出的广播就是有序广播。

 


三、注册广播接收者的两种方式

①在AndroidManifest.xml中注册

在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。下面的例子1、2广播接收者会接收到拨打电话的广播。

 

 
  1.   <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  2.       <activity android:name=".MainActivity" 
  3.                 android:label="@string/app_name"> 
  4.           <intent-filter> 
  5.               <action android:name="android.intent.action.MAIN" /> 
  6.               <category android:name="android.intent.category.LAUNCHER" /> 
  7.           </intent-filter> 
  8.       </activity> 
  9.         
  10.         <!-- 广播接收者1--> 
  11. <receiver android:name=".BroadcastReceiver1"> 
  12.     <intent-filter> 
  13.         <action android:name="android.intent.action.CALL"></action> 
  14.     </intent-filter> 
  15. </receiver> 
  16.  
  17. <!-- 广播接收者2 --> 
  18. <receiver android:name=".BroadcastReceiver2"> 
  19.     <intent-filter> 
  20.         <action android:name="android.intent.action.CALL"></action> 
  21.     </intent-filter> 
  22. </receiver> 
  23.  
  24. <!-- 广播接收者3 --> 
  25. <receiver android:name=".BroadcastReceiver3"> 
  26.     <intent-filter> 
  27.         <action android:name="android.intent.action.PICK"></action> 
  28.     </intent-filter> 
  29. </receiver> 
  30.  
  31.   </application> 

 

 
  1. /**  
  2.  * 模拟拨打电话广播  
  3.  *   
  4.  * @author 徐越  
  5.  *   
  6.  */ 
  7. public class MainActivity extends Activity  
  8. {  
  9.  
  10.     @Override 
  11.     public void onCreate(Bundle savedInstanceState)  
  12.     {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         Intent intent = new Intent();  
  16.         intent.setAction("android.intent.action.CALL");  
  17.         this.sendBroadcast(intent);  
  18.     }  
  19. }  
  20.  
  21. /**  
  22.  * 每次接收广播都会生成新的BroadcastReceiver1,当处理完onReceive方法后就不会再被使用  
  23.  * 再次接收就在生成新的BroadcastReceiver1对象  
  24.  *   
  25.  * @author 徐越  
  26.  *   
  27.  */ 
  28. public class BroadcastReceiver1 extends android.content.BroadcastReceiver  
  29. {  
  30.     public BroadcastReceiver1()  
  31.     {  
  32.         Log.i("xy_Receiver""construtor1");  
  33.     }  
  34.  
  35.     @Override 
  36.     public void onReceive(Context context, Intent intent)  
  37.     {  
  38.         Log.i("xy_Receiver""onReceive1");  
  39.     }  
  40.  
  41. }  
  42.  
  43. /**  
  44.  * 广播接收者2  
  45.  *   
  46.  * @author 徐越  
  47.  *   
  48.  */ 
  49. public class BroadcastReceiver2 extends android.content.BroadcastReceiver  
  50. {  
  51.     public BroadcastReceiver2()  
  52.     {  
  53.         Log.i("xy_Receiver""construtor2");  
  54.     }  
  55.  
  56.     @Override 
  57.     public void onReceive(Context context, Intent intent)  
  58.     {  
  59.         Log.i("xy_Receiver""onReceive2");  
  60.     }  
  61.  
  62. }  
  63.  
  64. /**  
  65.  * 广播接收者3  
  66.  *   
  67.  * @author 徐越  
  68.  *   
  69.  */ 
  70. public class BroadcastReceiver3 extends android.content.BroadcastReceiver  
  71. {  
  72.  
  73.     public BroadcastReceiver3()  
  74.     {  
  75.         Log.i("xy_Receiver""construtor3");  
  76.     }  
  77.  
  78.     @Override 
  79.     public void onReceive(Context context, Intent intent)  
  80.     {  
  81.         Log.i("xy_Receiver""onReceive3");  
  82.     }  
  83.  

②在Activity中注册

在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity中注册。

 

 
  1. /**  
  2.  * Activity中注册广播接收者  
  3.  *   
  4.  * @author 徐越  
  5.  *   
  6.  */ 
  7. public class MainActivity extends Activity  
  8. {  
  9.     private BroadcastReceiver receiver;  
  10.     private static final String CALL_ACTION = "android.intent.action.CALL";  
  11.  
  12.     @Override 
  13.     public void onCreate(Bundle savedInstanceState)  
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.     }  
  18.  
  19.     /**  
  20.      * 模拟发送一个电话的广播  
  21.      *   
  22.      * @param v  
  23.      */ 
  24.     public void sendBroadCast(View v)  
  25.     {  
  26.         Intent intent = new Intent();  
  27.         intent.setAction("android.intent.action.CALL");  
  28.         this.sendBroadcast(intent);  
  29.     }  
  30.  
  31.     public void bindReceiver(View v)  
  32.     {  
  33.         receiver = new BroadcastReceiver();  
  34.         IntentFilter intentFilter = new IntentFilter();  
  35.         intentFilter.addAction(CALL_ACTION);  
  36.         this.registerReceiver(receiver, intentFilter);  
  37.     }  
  38.  
  39.     public void unBindReceiver(View v)  
  40.     {  
  41.         this.unregisterReceiver(receiver);  
  42.     }  
  43. }  
  44.  
  45. public class BroadcastReceiver extends android.content.BroadcastReceiver  
  46. {  
  47.  
  48.     @Override 
  49.     public void onReceive(Context context, Intent intent)  
  50.     {  
  51.         Log.i("xy""receiver");  
  52.     }  
  53.  

 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1097197如需转载请自行联系原作者


woshixuye111

相关文章
|
2月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
419 76
|
3月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
106 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
3月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
255 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
90 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
175 1
|
4月前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
222 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
4月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
94 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
5月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
108 19
|
5月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
168 14

热门文章

最新文章