田海立@CSDN

2012-8-20

广播机制是Android系统中最常用的机制之一。顾名思义,广播就是广播发出者说‘这有事情发生了,所有听众都听着…’。这听众就是注册了的侦听者,所以我们印象中广播接收者都是要么在AndroidManifest.xml中申明,要么在程序中通过Context.registerReceiver()注册。其实Android的广播也是可以定向的,发给指定的对象,而接收者并不是上述的方式注册的。

笔者在研究AppWidget机制的时候,发现了疑问点:

AppWidgetProvider可以处理很多广播:AppWidgetManager.ACTION_APPWIDGET_UPDATE/ AppWidgetManager.ACTION_APPWIDGET_DELETED / AppWidgetManager.ACTION_APPWIDGET_ENABLED以及AppWidgetManager.ACTION_APPWIDGET_DISABLED。但是除了AppWidgetManager.ACTION_APPWIDGET_UPDATE有被显示地在AndroidManifest.xml申明外,其他的广播都没有被注册,而这些广播又确实是能够收到的。

研究了一番,发现:

AppWidget是通过AppWidgetManager.ACTION_APPWIDGET_UPDATE找到AppWidgetProvider的,这样找到AppWidgetProvider之后,也就获得了实现该AppWidgetProvider的packageName和className。而当需要通知AppWidgetProvider的时候,由于已经知道了其所在的package和具体哪个实现类,就可以组成ComponentName了,直接向该Component发送广播。这就相当于说,已经知道要发送给谁了,不管有没有注册,都要送达广播到他那。【想想,这不像是广播的行为了,不过确实是这样】

再跟踪Broadcast发送的实现[Context-> ContextImp -> ActivityManagerNative -> ActivityManagerService.broadcastIntent()-> broadcastIntentLocked()],发现确实是这样:如果intent中已经指定了Component,就把它组成Receiver,然后再跟已经注册的该广播的Receiver合并在一起,适时的给所有这些Receiver发送广播。

斯以为记,以备后查!

更多相关文章

  1. Android(安卓)四大组件之BroadcastReceiver广播接收器(使用详解)
  2. Kotlin 风险高、RxJava 已过时,Android(安卓)原生开发现状分析!
  3. Android(安卓)Handler机制
  4. Android轮询机制
  5. Android(安卓)性能优化(二)Handler运行机制原理,源码分析
  6. 杂谈(android基础知识点梳理笔记)
  7. 3. Android(安卓)MultiMedia框架完全解析 - setDataSource继续分
  8. android 热修复之类加载机制
  9. Android布局优化(一),Android渲染机制

随机推荐

  1. 设置无标题&设置不显示状态栏
  2. android:screenOrientation的说明
  3. Android(安卓)判断点是否在Path中(含不规
  4. Android新增音频流类型
  5. Android(安卓)利用方向传感器实现 指南针
  6. Android桌面小部件实例 桌面小时钟
  7. Android(总结):控件居中|水平居中|垂直居中
  8. android中小知识点积累
  9. Android(安卓)Adapter
  10. android控件属性