简介
项目中注册自定义静态广播,使用adb broadcast 命令发送广播并携带数据给到静态广播。然而发现命令发送后没有被接受到,发送命令如下:
am broadcast -n com.tang.test.intent.action.TEST --ei time 1
排除
- 广播注册有问题
- 通过代码发送成功,可排除注册有问题
Intent intent = new Intent("com.tang.test.intent.action.TEST");
intent.setComponent(new ComponentName("com.tang.test","com.tang.test.MyBroadcastReceiver"));
sendBroadcast(intent);
- 命令发送有问题
- 对比,发现没有问题
猜测
- 跟Android版本有关系,高版本做了限制
8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出的改变,也就是说广播和服务不能随意收intent了,要对广播和服务更精确的指向,所以在创建intent的时候,我们需要指定我们的广播和服务的包名加类名,为的就是精确。
参考
- ComponentName 如何通过命令体现
-n com.xxx.somepackage/com.xxx.packagesclass
解决方案
命令中添加ComponentName 即可
am broadcast -n com.tang.test.intent.action.TEST --ei time 1 -n com.tang.test/com.tang.test.MyBroadcastReceiver
其他
- 各字段代码实现
// Action
intent.setAction("com.xxx.action.SOME_ACTION");
// Component
intent.setComponent(new Component("com.xxx.somepackage", "com.xxx.packagesclass"));
// Package
intent.setPackage("com.xxx.someReceivePackage");
// Extra-String
intent.putExtra("extraStringName", "stringValue");
// Extra-Int
intent.putExtra("extraIntName", 1);
// Extra-Boolean
intent.putExtra("extraBoolName", true);
// 权限
Context.sendBroadcast(someIntent, "SOME_PERMISSION");
...后续再补充
- 代码对应的shell指令
// Action
-a com.xxx.action.SOME_ACTION
// Component
-n com.xxx.somepackage/com.xxx.packagesclass
// Package
-p com.xxx.someReceivePackage
// Extra-String 注意String字符中存在的双引号需要做转义 \"
-es extraStringName "stringValue"
// Extra-Int
-ei extraIntName 1
// Extra-Boolean
-ez extraBoolName true
// 权限
am broadcast --receiver-permission "SOME_PERMISSION"
...后续再补充