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
我曾经在测试一个省电应用时,需要反复模拟低电量场景。手动拔电池?不现实。用这条命令,一秒触发,效率翻倍。
实战:打开特定设置页面
这个实战场景我几乎每周都会用到。比如测试蓝牙功能,你需要打开蓝牙设置页面。手动操作:设置 → 连接设备 → 蓝牙。三步。用 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 列表,确认类名后再操作。
adb shell am start -a <ACTION> 试一下。如果系统找不到匹配的 Activity,会报错并提示你。这比翻文档快多了。
知识体系图
下面这张图帮你理清今天讲的核心逻辑:
避坑指南
我曾经在调试一个第三方应用时,用 am start 怎么都打不开它的某个 Activity。查了半天,发现是那个 Activity 在 Manifest 里设置了 exported="false"。嗯,这个属性决定了外部能否通过隐式 Intent 启动它。如果你遇到类似问题,先检查一下这个。
另外,发送广播时如果带了自定义权限,记得在命令里加上 --receiver-permission 参数,否则接收器可能收不到。
am start 和 am broadcast,你就能在调试时跳过繁琐的 UI 操作,直接触达目标。这不仅是效率的提升,更是对 Android 组件化通信机制的深入理解。
公众号:蓝海资料掘金营,微信 deep3321