Android中的广播也定向
2012-08-20 21:09
274 查看
田海立@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发送广播。
斯以为记,以备后查!
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发送广播。
斯以为记,以备后查!
相关文章推荐
- 解析JVM线程同步机制&& Android中的广播也定向
- Android定向广播
- Android 的定向广播 局部广播
- Android之定向广播
- android动态注册广播监听服务demo
- 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。
- android 广播
- Android通过广播实现灭屏和亮屏
- Android 内部类广播错误.MainActivity$MyReceiver; no empty constructor
- android判断短信是否发送成功[动态注册广播]
- Android—自定义广播
- Android静态注册无法接受系统广播问题
- android_有序广播
- android 单元测试 注册广播接收器
- Android数据传递,使用广播BroadcastReceiver;
- Android四大基本组件之一 ,广播(broadcast receiver)---无序广播
- 说说 Android 的广播机制
- 通过广播Intent控制Android系统自带的音乐播放器
- Android学习记录五(活动、服务、内容提供者、广播接收者)
- android中的自定义广播