27、ADB 与 Intent:启动 Activity、发送广播、打开设置页面

说实话,ADB 和 Intent 的组合,是我日常调试中使用频率最高的技巧之一。你想想看,每次手动点开几十层菜单去找一个设置项,是不是很烦?用 ADB 发一条 Intent,一秒直达。今天我们就来彻底搞懂这件事。

Intent 是什么?先别想太复杂

Intent 说白了就是 Android 系统里的「消息快递员」。你想启动一个界面?发个 Intent。你想通知其他组件做点事?发个 Intent。它就是个信使,告诉系统:「嘿,帮我打开这个页面」或者「嘿,通知那个广播接收器干活」。

Intent 分两种:显式 Intent 和隐式 Intent。显式的就像你直接喊一个人的名字:「张三,过来!」。隐式的就像你喊:「谁会修电脑?过来一下」。系统会自己匹配能处理这个请求的组件。

我个人习惯在调试时优先用隐式 Intent,因为不用记包名和类名,只要知道 Action 就够了。但有些场景,比如打开特定设置页面,就得用显式 Intent 加上具体参数。

adb shell am start:启动 Activity

这是最常用的命令。格式很简单:

adb shell am start -a <ACTION> -d <DATA_URI> -t <MIME_TYPE> -n <COMPONENT>

常用的参数我列一下:

参数 含义 示例
-a Action,要执行的动作 android.intent.action.VIEW
-d Data URI,数据地址 tel:10086
-t MIME 类型 text/plain
-n 组件名(包名 + 类名) com.android.settings/.Settings
--ei 传递 int 类型 extra --ei key 123
--es 传递 String 类型 extra --es key "value"

举个例子,打开浏览器访问我的博客:

adb shell am start -a android.intent.action.VIEW -d "https://example.com"

这条命令会触发系统默认浏览器,打开指定网址。我在项目中经常用这个来快速验证 Deep Link 是否配置正确。

adb shell am broadcast:发送广播

广播(Broadcast)是 Android 组件间通信的另一种方式。你可以用 ADB 模拟系统发广播,或者触发你自己写的 BroadcastReceiver。

adb shell am broadcast -a <ACTION> --es key "value"

比如模拟电量低广播:

adb shell am broadcast -a android.intent.action.BATTERY_LOW

我曾经在测试一个省电应用时,需要反复模拟低电量场景。手动拔电池?不现实。用这条命令,一秒触发,效率翻倍。

注意:Android 8.0 之后,系统对隐式广播做了限制。大部分隐式广播无法被静态注册的接收器捕获。如果你发现广播发出去没反应,先检查一下接收器的注册方式。

实战:打开特定设置页面

这个实战场景我几乎每周都会用到。比如测试蓝牙功能,你需要打开蓝牙设置页面。手动操作:设置 → 连接设备 → 蓝牙。三步。用 ADB:

adb shell am start -a android.settings.BLUETOOTH_SETTINGS

一步到位。常用的设置页面 Action 我整理了一份:

功能 Action
Wi-Fi 设置 android.settings.WIFI_SETTINGS
蓝牙设置 android.settings.BLUETOOTH_SETTINGS
应用管理 android.settings.APPLICATION_SETTINGS
开发者选项 android.settings.APPLICATION_DEVELOPMENT_SETTINGS
日期时间设置 android.settings.DATE_SETTINGS
显示设置 android.settings.DISPLAY_SETTINGS
安全设置 android.settings.SECURITY_SETTINGS
声音设置 android.settings.SOUND_SETTINGS

如果你需要打开某个应用的内部页面,就得用组件名了。比如打开微信的聊天设置:

adb shell am start -n com.tencent.mm/.ui.chatting.ChattingUI

嗯,这里要注意,组件名里的包名和类名必须完全匹配,大小写敏感。我建议你先用 dumpsys package 查一下目标应用的 Activity 列表,确认类名后再操作。

小技巧:如果你不确定某个 Action 是否存在,可以先用 adb shell am start -a <ACTION> 试一下。如果系统找不到匹配的 Activity,会报错并提示你。这比翻文档快多了。

知识体系图

下面这张图帮你理清今天讲的核心逻辑:

ADB + Intent 启动 Activity am start -a ACTION am start -n 组件名 支持 -d -t --ei --es 发送广播 am broadcast -a ACTION 支持 extra 参数 注意 Android 8.0 限制 打开特定设置页面 使用系统预定义 Action 或直接指定组件名

避坑指南

我曾经在调试一个第三方应用时,用 am start 怎么都打不开它的某个 Activity。查了半天,发现是那个 Activity 在 Manifest 里设置了 exported="false"。嗯,这个属性决定了外部能否通过隐式 Intent 启动它。如果你遇到类似问题,先检查一下这个。

另外,发送广播时如果带了自定义权限,记得在命令里加上 --receiver-permission 参数,否则接收器可能收不到。

核心总结:ADB 操作 Intent 的本质,就是模拟系统组件间的通信。掌握 am startam broadcast,你就能在调试时跳过繁琐的 UI 操作,直接触达目标。这不仅是效率的提升,更是对 Android 组件化通信机制的深入理解。

公众号:蓝海资料掘金营,微信 deep3321