Android adb命令发送广播介绍
文章目录
- [Android adb命令发送广播介绍](#Android adb命令发送广播介绍)
-
- 一、前言
- 二、发送广播命令介绍
-
- 1、发送广播命令格式
- 2、发送广播示例
-
- [(1) 发送开机广播](#(1) 发送开机广播)
- [(2) 发送自定义广播携带String数据](#(2) 发送自定义广播携带String数据)
- [(3) 发送自定义广播携带int数据](#(3) 发送自定义广播携带int数据)
- [(4) 发送自定义广播携带多个数据](#(4) 发送自定义广播携带多个数据)
- [(5) 发送自定义广播设置为前台广播](#(5) 发送自定义广播设置为前台广播)
- [3、Android Java代码介绍广播主要代码](#3、Android Java代码介绍广播主要代码)
- 三、其他
-
- 1、adb发送广播的完整格式
- [2、Android 发送广播设置flags的作用](#2、Android 发送广播设置flags的作用)
- [3、Android 蓝牙相关广播介绍](#3、Android 蓝牙相关广播介绍)
- [4、Android13 不能静态注册的几个广播](#4、Android13 不能静态注册的几个广播)
一、前言
Android 广播除了代码中发送,还可以使用命令模拟发送,只要应用代码中进行了监听,都可以正常接收到的。
掌握手动发送广播命令,可以方便某些代码的调试。
所以学习一下Android adb方式 发送广播命令是有用的。有需要的可以收藏使用。
二、发送广播命令介绍
1、发送广播命令格式
adb shell 发送广播的完整命令格式:
adb shell am broadcast -a <action> [-d ] [-t <mime_type>] [-c <category>] [-n <component>] [-f <flags>] [-e|--es|ei|eb <extra_key> <extra_value>]...
其中, `` 是广播的动作,可以是Android系统定义的动作,也可以是自定义的动作;`
-d 是数据的URI;
-t 是数据的MIME类型;
-c 是广播的类别;
-n 是广播的组件;
-f 是标志位;
--es|ei|ef` 是额外的键值对参数。
其中,-d,-t,-c,-n,-f都是不常用的,只有设置额外数据的 --es,--ei这些是常用的,并且可以设置多个。
es表示 extra_string,ei表示 extra_int,其他的eu,ef以此类推。
以下是一个示例,发送一个最简单的自定义广播:
adb shell am broadcast -a test
这样就可以发送一个自定义动作action为 test 的广播,监听了这个广播的应用就可以收到广播。
自定义的action是可以很随意的,不是一定要设置成 android.intent.XXX或者com.broadcast.XXX
即使一个一两个字母也可以是action,但是一般情况设置的action具有一定含义会避免混乱。
有时候要指定某个应用和某个类来接收的广播,可以用 "-n",比如:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name
下面是部分常用广播示例。
2、发送广播示例
(1) 发送开机广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
开机广播也是可以发送的,并且是没有参数的;
开机完成后,再发送这个广播,监听了开机广播的应用是会再次接收到这个广播的。
但是一般不会手动发这个广播,除了特殊调试使用,因为一般情况意义不大。
除了开机广播,其他的大部分系统广播,比如网络变化广播,时间变化广播等等,都是可以通过命令发送的。
有些广播是携带数据的,数据的携带可以参考下面示例。
(2) 发送自定义广播携带String数据
adb shell am broadcast -a test -es name liwenzhi
(3) 发送自定义广播携带int数据
adb shell am broadcast -a test -ei age 100
(4) 发送自定义广播携带多个数据
adb shell am broadcast -a test -es name liwenzhi --ei age 100 --ef height 180.11
以此类推,多个类型数据用空格隔开就可以了。
(5) 发送自定义广播设置为前台广播
adb shell am broadcast -a test -es name liwenzhi -f 0x10000000
3、Android Java代码介绍广播主要代码
//注册广播
public void registerBroadcast(Context context) {
String a = Intent.ACTION_SCREEN_OFF;
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
intentFilter.addAction("test");
context.registerReceiver(mMyReceiver, intentFilter);
}
//反注册广播
public void unRegisterBroadcast(Context context) {
context.unregisterReceiver(mMyReceiver);
}
//广播监听
private final BroadcastReceiver mMyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action == null) {
DebugLog.error("action == null!");
return;
}
//action打印
DebugLog.info("action = " + action);
//数据获取
String name = intent.getStringExtra("name");
DebugLog.info("name = " + name);
int age = intent.getIntExtra("age",-1);
DebugLog.info("age = " + age);
//处理相关action事务
switch (action) {
case "test":
break;
//...
}
}
三、其他
1、adb发送广播的完整格式
上面介绍的只是一些常用的格式,还有一些复制的格式没有介绍。
如果要看比较完整的命令集,输入命令 "adb shell am" 回车后有很多相关命令的介绍,
拉到最后里面包含了 broadcast 命令介绍
<INTENT> specifications include these flags and arguments:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] [-i <IDENTIFIER>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-n <COMPONENT_NAME>]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--esn <EXTRA_KEY> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
[--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
[--ed <EXTRA_KEY> <EXTRA_DOUBLE_VALUE> ...]
[--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
[--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]
[--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
(multiple extras passed as Integer[])
[--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
(multiple extras passed as List<Integer>)
[--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
(multiple extras passed as Long[])
[--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
(multiple extras passed as List<Long>)
[--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
(multiple extras passed as Float[])
[--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
(multiple extras passed as List<Float>)
[--eda <EXTRA_KEY> <EXTRA_DOUBLE_VALUE>[,<EXTRA_DOUBLE_VALUE...]]
(multiple extras passed as Double[])
[--edal <EXTRA_KEY> <EXTRA_DOUBLE_VALUE>[,<EXTRA_DOUBLE_VALUE...]]
(multiple extras passed as List<Double>)
[--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
(multiple extras passed as String[]; to embed a comma into a string,
escape it using "\,")
[--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
(multiple extras passed as List<String>; to embed a comma into a string,
escape it using "\,")
[-f <FLAG>]
参数大致含义根据字面意思理解即可
2、Android 发送广播设置flags的作用
在Android中,广播的标志位(flags)可以用来控制广播的行为和影响接收广播的方式。以下是一些常见的广播标志位及其作用:
- `FLAG_INCLUDE_STOPPED_PACKAGES`:包括已停止的应用程序接收广播。
默认情况下,已停止的应用程序是不会接收到广播的。
- `FLAG_RECEIVER_REGISTERED_ONLY`:只有在代码中注册了对应广播接收器的应用程序才会接收到广播。
如果某个应用程序没有注册对应的接收器,那么它将不会接收到该广播。
- `FLAG_RECEIVER_REPLACE_PENDING`:替换正在等待的广播。
如果有其他相同类型的广播正在等待处理,使用该标志位可以替换掉当前等待的广播。
- `FLAG_RECEIVER_FOREGROUND`:将广播直接发送给运行在前台的应用程序。
这可以用于确保重要的广播消息被前台应用程序及时接收到。这个也是最常用的。
- `FLAG_RECEIVER_NO_ABORT`:即使当前广播接收器中断了广播(例如抛出异常),也继续发送广播给其他接收器。默认情况下,如果一个接收器中断了广播,后续的接收器将不会收到该广播。
这些标志位可以通过在发送广播时使用 -f
参数来设置,例如:
adb shell am broadcast -a com.example.MY_ACTION -f 0x10000000
这个表示前台广播。
请注意,具体的标志位数值可能会因Android版本和设备而有所不同。你可以根据自己的需求选择适当的标志位来控制广播的行为。
广播flag定义的文件和部分数值:
framework\base\core\java\android\content\Intent.java
public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 0x00000020;
public static final int FLAG_RECEIVER_REGISTERED_ONLY = 0x40000000;
public static final int FLAG_RECEIVER_REPLACE_PENDING = 0x20000000;
public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000; //前台广播
public static final int FLAG_RECEIVER_NO_ABORT = 0x08000000;
3、Android 蓝牙相关广播介绍
蓝牙开启、关闭、断开、连接等广播,具体可以看:
https://blog.csdn.net/wenzhi20102321/article/details/134956116
4、Android13 不能静态注册的几个广播
Android 所有广播都是可以动态注册,但是部分广播静态注册是无法收到的,具体可以看:
https://blog.csdn.net/wenzhi20102321/article/details/134956090