注册广播
动态注册
时序图

广播的存储

静态注册
1 | /** |
发送广播
路径
1 |
|
broadcastIntent
1 | /** |
broadcastIntentLocked
1 | /** |
performReceiveLocked
1 | /** |
LoadApk.ReceiverDispatcher:performReceive
1 | public void performReceive(Intent intent, int resultCode, String data, |
LoadApk.ReceiverDispatcher.Args:run
1 | public void run() { |
安全校验
等级
uid = userId * 100000 + appId
uid//进程功能的一种标识
ID的区间
uid
有root, system,radio,media等都属于系统uid定义在在Process.java文件,如下:
| uid | 值 | 含义 |
|---|---|---|
| ROOT_UID | 0 | root uid |
| SYSTEM_UID | 1000 | 用于systemserver进程 |
| PHONE_UID | 1001 | telephony所属的uid |
| BLUETOOTH_UID | 1002 | 蓝牙所属的uid |
| LOG_UID | 1007 | log所属的uid |
| WIFI_UID | 1008 | |
| MEDIA_UID | 1013 | 用于mediaserver进程 |
| VPN_UID | 1016 | |
| DRM_UID | 1019 | |
| MEDIA_RW_GID | 1023 | 具有写内部媒体存储权限的uid |
| …… | …… | …….. |
对于非systerm的uid会进行权限的检查
userId
| userId | 赋值 | 含义 |
|---|---|---|
| USER_OWNER | 0 | 拥有者 |
| USER_ALL | -1 | 所有用户 |
| USER_CURRENT | -2 | 当前活动用户 |
| USER_CURRENT_OR_SELF | -3 | 当前用户或者调用者所在用户 |
| USER_NULL | -1000 | 未定义用户 |
1 | //reference code |
appId
- system appid: [1000, 9999]
- application appid:[10000, 19999]
- Shared AppGid: [50000, 59999]
- isolated appid: [99000, 99999]
1 | //reference code |
权限
发送广播
- intentfilter进行一部分广播的过滤
- sendBroadcast(Intent, String)的接口在发送广播时指定接收者必须具备的permission
- 通过Intent.setPackage设置广播仅对某个程序有效
- protectionLevel 可以设置到签名等级,防止反编译后被第三方应用模拟相同的权限
注册广播
- registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定发送者必须具备的permission
- 对于静态注册的广播可以通过android:exported=”false”属性表示接收者对外部应用程序不可用
- protectionLevel可以设置到签名等级,防止反编译后被第三方应用模拟相同的权限
开源框架 EventBus
背景
广播的缺点
它是重量级的,费时的一种方式;
可以接受各种系统的通知包括电量变化,系统设置,短信等等,所以就决定了它需要基于android的
sdk,而且它支持跨进程通信,决定了它必须通过AMS做一次judge.
EventBus的优点
- 它是轻量,快速的一种方式;
- 使用简单。register注册,post发送,onEvent进行事件的处理;
- 提供了观察者所没有的粘滞,优先级的处理逻辑,对齐了broadcastRecevicer;
架构图

流程步骤
注册与注销
1 | 1.param |
发送
1 | post(Object event) |