Android中通过ADB手动发送广播

本文介绍了一种通过U盘触发系统升级的方法,并探讨了如何使用ADB命令手动发送广播及接收广播的动作。此外还详细说明了BroadcastReceiver类的创建与注册过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   公司最近在做一个项目,通过拔插U盘触发系统动作广播ACTION弹出升级界面,对系统软件进行升级,包括OS,APP,MCU,MAP,Configfile.
但是在调试过程中发现拔插U盘时接收不到系统广播动作,于是通过手动发送广播进行调试。

   我们知道系统可以产生很多广播动作,例如  

          android.intent.action.BOOT_COMPLETED,

          android.intent.action.MEDIA_MOUNTED,

          android.intent.action.MEDIA_REMOVED........

   通过ADB命令进行广播发送可以用adb shell am broacast -a [ACTION]
当命令发送之后需要对广播进行接收,因此需要新建一个BroadcastReceiver类对广播进行接收,需要注意一定要在Androidmainfest中对广播进行注册。
注册广播接收后就可以通过LOG打印出广播的动作ACTION了。

或者通过ADB命令在命令行中打印LOG
adb shell logcat -s [BroadcastReceiver]


<think>我们正在讨论Android广播发送的两种方式:通过ADB发送和通过应用程序内发送。用户希望理解这两种方式的区别。根据引用[1]和[2],我们知道在应用程序内发送广播通常使用Intent并指定Action,然后调用sendBroadcast()方法。同时,引用[1]还提到,从Android8.0(API级别26)开始,对静态注册的广播接收器施加了限制,无法接收隐式广播,因此需要指定包名(使用setPackage())使其成为显式广播。而通过ADB发送广播,我们使用命令行工具adb,具体命令格式如下:```adb shellam broadcast-a <ACTION>[其他选项] ```现在,我将详细分析两种方式的区别: 1. **发送源不同**:-ADB发送:从电脑命令行通过adb工具发送,通常用于测试或调试。-应用程序内发送:在应用程序代码中发送,用于应用程序内部或应用程序间的通信。2.**接收限制(针对静态注册的接收器)**:-在应用程序内发送广播时,如果目标接收器是静态注册(在AndroidManifest.xml中声明),则从Android8.0开始,必须使用显式广播(即指定接收器的包名)。引用[1]中说明了这一点,并给出了使用setPackage()的示例。-通过ADB发送广播时,我们可以通过指定包名(使用`-p<包名>`)来发送显式广播,也可以发送隐式广播(不指定包名)。但是,对于静态注册的接收器,如果发送的是隐式广播,则接收器无法接收(除非广播是针对系统级别的,或者应用具有特定的权限)。因此,在ADB命令中,我们通常也会指定包名来确保静态注册的接收器能收到。 3. **权限**:-在应用程序内发送广播时,可以设置权限(通过sendBroadcast()的第二个参数指定权限),只有具有相应权限的接收器才能接收。-在ADB发送广播时,可以通过`--permission`选项指定权限。4.**附加数据**:-应用程序内发送:可以通过Intent的putExtra()方法附加数据。-ADB发送:可以通过`--es`(字符串)、`--ei`(整数)等选项附加数据。 5. **使用场景**:-ADB发送:主要用于开发和测试阶段,快速验证广播接收器的工作情况。-应用程序内发送:用于实际应用程序运行时的通信。6.**广播类型**:-在应用程序内,可以发送有序广播(使用sendOrderedBroadcast())和无序广播(sendBroadcast())。-ADB发送默认是无序广播,但可以通过`--receiver-permission`等参数模拟有序广播的部分特性(如设置接收者权限),但ADB命令本身没有直接等同于有序广播的选项。 7. **执行环境**:-ADB发送:需要连接设备或模拟器,通过命令行执行。-应用程序内发送:在应用运行时,由代码触发。 8. **动态注册与静态注册接收器的区别**:-动态注册的广播接收器(在代码中通过registerReceiver()注册)不受Android8.0隐式广播限制的影响,因此无论是显式还是隐式广播都能接收。-静态注册的接收器则必须接收显式广播(除非广播是系统广播或豁免的广播)。因此,总结如下: -**ADB发送广播**:是开发调试工具,命令格式为`adbshell ambroadcast -a <ACTION>[选项]`,可以指定包名、附加数据、权限等。它模拟了应用发送广播的行为,但直接从系统层面发送。- **应用内发送广播**:在代码中构建Intent,设置Action和附加数据,然后调用sendBroadcast()(或sendOrderedBroadcast())。需要注意Android版本对静态注册接收器的限制,通常需要指定包名。下面是一个示例对比:**应用内发送广播(显式广播,针对特定包)**:```javaIntentintent =new Intent("com.example.MY_ACTION");intent.setPackage("com.example.targetapp"); //指定包名,使其成为显式广播intent.putExtra("data","Hello");sendBroadcast(intent);``` **通过ADB发送相同的广播**: ```bashadb shellam broadcast-acom.example.MY_ACTION-pcom.example.targetapp--esdata"Hello" ```相关问题:1.在Android8.0及以上版本,静态注册的广播接收器如何接收广播? 2.如何使用ADB发送带有复杂数据(如数组)的广播? 3.动态注册的广播接收器和静态注册的广播接收器在接收广播时有什么不同?</think>### ADB发送广播与App内发送广播的区别 在Android系统中,通过ADB发送广播和在应用程序内发送广播主要有以下核心区别: #### 1. **发送主体不同** - **ADB发送** 通过计算机命令行工具(`adb shell am broadcast`)触发,需要设备连接USB并开启调试模式。 示例命令: ```bash adb shell am broadcast -a com.example.ACTION_NAME -p com.example.package ``` 本质是**系统级操作**(由`am`工具调用`ActivityManagerService`实现)[^3]。 - **App内发送** 在应用程序代码中通过`Context.sendBroadcast()`方法触发,属于**应用层操作**。 示例代码: ```java Intent intent = new Intent("com.example.ACTION_NAME"); intent.setPackage("com.example.package"); // 显式广播必须指定包名 sendBroadcast(intent); ``` #### 2. **广播类型限制** - **ADB发送** 默认发送**显式广播**(需通过`-p`参数指定目标包名),不受Android 8.0+的隐式广播限制影响。 - **App内发送** - 若发送**隐式广播**(未指定包名),Android 8.0+系统会**屏蔽静态注册的接收器**(动态注册不受影响)[^1]。 - 必须显式调用`intent.setPackage()`转为显式广播才能被静态接收器接收。 #### 3. **权限控制** - **ADB发送** 需`adb`拥有`shell`权限(通常需开发者手动授权USB调试),可发送系统级广播(如`BOOT_COMPLETED`)。 - **App内发送** 受应用自身权限限制: - 普通广播需声明`<uses-permission>`。 - 系统广播需申请`SEND_BROADCAST`等特定权限。 #### 4. **使用场景** | **场景** | ADB发送 | App内发送 | |------------------------|----------------------------------|-------------------------------| | **测试/调试** | ✅ 快速验证接收逻辑 | ❌ 需编译部署应用 | | **生产环境通信** | ❌ 不适合 | ✅ 标准应用间通信方式 | | **系统级广播** | ✅ 可发送(如重启事件) | ❌ 需系统签名权限 | | **静态接收器支持** | ✅ 默认支持 | ✅ 需显式指定包名 | #### 5. **数据传递差异** - **ADB发送** 通过命令行参数附加数据: ```bash adb shell am broadcast -a ACTION --es key value --ei number 123 ``` - **App内发送** 通过`Intent.putExtra()`附加数据: ```java intent.putExtra("key", "value"); intent.putExtra("number", 123); ``` > **关键结论**: > ADB广播是**开发调试工具**,直接绕过应用层调用系统服务;而App内广播是**标准通信机制**,需遵守Android广播安全策略(尤其Android 8.0+的显式广播要求)[^1][^2]。 --- ### 相关问题 1. 为什么Android 8.0开始限制隐式广播?这种限制如何影响应用兼容性? 2. 如何通过ADB发送携带复杂数据(如数组或对象)的广播? 3. 动态注册广播接收器和静态注册广播接收器在接收ADB广播时有何不同行为? 4. 在Android 12+的隐私保护政策下,广播机制有哪些新的安全限制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值