一、BroadcastReceiver 基础概念
在Android系统中,BroadcastReceiver(广播接收器)是一种用于接收系统或应用发送的广播消息的组件。它可以让应用监听系统级事件,如电量变化、网络状态改变、屏幕开关、短信接收等,也可以监听自定义应用广播,实现组件间的通信。
BroadcastReceiver本身不包含用户界面,但它可以启动Activity、显示通知、更新UI或者执行后台任务。它是Android四大组件之一,与Activity、Service、ContentProvider并列。
1.1 Receiver的工作原理
BroadcastReceiver的工作流程可以分为三个步骤:
- 注册Receiver:在AndroidManifest.xml中静态注册,或在代码中动态注册
- 发送广播:系统或应用通过sendBroadcast()发送广播消息
- 接收处理:Receiver收到广播后,在onReceive()方法中执行相应逻辑
二、AndroidManifest.xml中Receiver的详细配置
在AndroidManifest.xml中注册Receiver是最常用的方式,称为静态注册。通过安卓修改大师反编译APK后,我们可以直接编辑AndroidManifest.xml文件来添加或修改Receiver配置。
一个标准的Receiver声明格式如下:
<receiver
android:name=".BatteryReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BATTERY_STATS">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
<action android:name="android.intent.action.BATTERY_LOW" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
2.1 Receiver标签的所有属性详解
| 属性名 | 类型 | 是否必需 | 用途说明 |
| android:name | String | 是 | 指定Receiver类的完整类名(包名+类名)。例如 ".BatteryReceiver" 表示当前包名下的BatteryReceiver类。 |
| android:enabled | boolean | 否 | 是否启用该Receiver。true为启用,false为禁用。默认为true。用于控制Receiver是否响应广播。 |
| android:exported | boolean | 否 | 是否允许其他应用向该Receiver发送广播。true为允许,false为仅接收本应用或系统广播。Android 12以上,如果Receiver包含intent-filter且未显式设置exported,系统会报安全警告。 |
| android:permission | String | 否 | 设置发送方必须拥有的权限。只有持有该权限的应用才能向此Receiver发送广播。可用于增强安全性。 |
| android:process | String | 否 | 指定Receiver运行的进程名称。默认为应用主进程。可设置为":remote"等值,让Receiver在单独进程中运行。 |
| android:directBootAware | boolean | 否 | 是否在设备未解锁(Direct Boot模式)时接收广播。用于加密设备在启动后立即需要的功能。 |
| android:icon | Drawable | 否 | 指定Receiver的图标,在部分系统UI中显示。 |
| android:label | String | 否 | 指定Receiver的标签,用于描述该Receiver的用途。 |
💡 关键提示:在安卓修改大师中反编译APK后,AndroidManifest.xml文件会以可编辑的文本形式呈现,你可以直接修改以上所有属性。软件提供了语法高亮和代码折叠功能,让XML编辑更加直观便捷。
2.2 intent-filter子标签详解
intent-filter是Receiver的核心部分,它声明了该Receiver可以接收哪些广播动作。以下是常用的系统广播action:
| Action常量 | 触发条件 | 所需权限 |
| android.intent.action.BATTERY_CHANGED | 电池电量或充电状态发生变化 | 无(粘性广播,需动态注册) |
| android.intent.action.BATTERY_LOW | 电池电量低于阈值(通常是20%) | 无 |
| android.intent.action.BATTERY_OKAY | 电池电量恢复到正常水平 | 无 |
| android.intent.action.ACTION_POWER_CONNECTED | 插入充电器 | 无 |
| android.intent.action.ACTION_POWER_DISCONNECTED | 拔出充电器 | 无 |
| android.intent.action.BOOT_COMPLETED | 系统启动完成 | RECEIVE_BOOT_COMPLETED |
| android.intent.action.CONNECTIVITY_CHANGE | 网络连接状态变化 | ACCESS_NETWORK_STATE |
intent-filter还可以包含<data>标签,用于过滤特定的数据URI和MIME类型。但针对电量监听场景,我们只需要使用action即可。
三、实战案例:监听电量变化并弹出低电量提醒
现在,我们通过一个完整的实战案例来演示如何用安卓修改大师修改APK,实现电量监听功能。我们将以一个简单的计算器APP为例,为其添加电量监听Receiver,当电量低于20%时弹出Toast提醒用户充电。
3.1 准备工作
首先,从安卓修改大师官网 www.apkeditor.cn 下载并安装最新版本的软件。该软件大小为12.45MB,版本为11.14.00.00,支持Windows系统。
准备一个目标APK文件(例如一个简单的计算器应用),确保该APK没有经过加固处理。如果应用经过360加固、腾讯加固或爱加密等方案,需要使用安卓修改大师的“脱壳修复”功能先进行脱壳处理。
1打开APK文件:启动安卓修改大师,点击主界面的"新建项目"按钮,选择目标APK文件。软件会自动开始反编译,进度条会显示在界面底部。
2进入AndroidManifest.xml编辑:反编译完成后,在左侧文件树中找到并双击AndroidManifest.xml文件,软件内置的编辑器会自动打开该文件,并以语法高亮形式展示XML内容。
3.2 在AndroidManifest.xml中添加Receiver配置
在AndroidManifest.xml的<application>标签内,找到其他组件声明的区域(如已有的<activity>标签附近),插入以下Receiver声明:
<receiver
android:name=".BatteryReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
<action android:name="android.intent.action.BATTERY_LOW" />
</intent-filter>
</receiver>
参数说明:
android:name=".BatteryReceiver":指定广播接收器类的名称。前面的点号表示相对于应用包名的相对路径。例如,如果应用包名为com.example.calculator,则完整类名为com.example.calculator.BatteryReceiver。
android:enabled="true":确保接收器处于启用状态,可以正常接收广播。
android:exported="true":允许系统向该接收器发送广播。对于系统广播,通常需要设置为true。
<intent-filter>:声明接收器关心的广播类型。BATTERY_CHANGED用于监听电量变化,BATTERY_LOW用于监听低电量状态。
⚠️ 重要提醒:安卓修改大师内置了智能提示功能,当你输入Receiver标签时,软件会自动补全属性和提示可选值,大大降低了手动输入的错误率。据真实用户反馈,该功能的引入让XML编辑效率提升了50%以上。
3.3 创建BatteryReceiver类文件
接下来,我们需要在反编译后的项目中创建BatteryReceiver类的Smali代码。在安卓修改大师中,我们可以通过以下步骤实现:
3定位Smali目录:在左侧文件树中找到smali目录,右键点击应用包名对应的文件夹(例如smali/com/example/calculator/),选择"新建文件"。
4创建BatteryReceiver.smali文件:在新建的文件中输入以下Smali代码:
.class public Lcom/example/calculator/BatteryReceiver;
.super Landroid/content/BroadcastReceiver;
.source "BatteryReceiver.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 1
invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V
return-void
.end method
# virtual methods
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 9
.param p1, "context" # Landroid/content/Context;
.param p2, "intent" # Landroid/content/Intent;
.prologue
.line 2
const-string v0, "BatteryReceiver"
.line 3
.local v0, "TAG":Ljava/lang/String;
invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v1
.line 4
.local v1, "action":Ljava/lang/String;
const-string v2, "android.intent.action.BATTERY_CHANGED"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v2
if-eqz v2, :cond_4a
.line 5
const-string v2, "level"
const/4 v3, 0x0
invoke-virtual {p2, v2, v3}, Landroid/content/Intent;->getIntExtra(Ljava/lang/String;I)I
move-result v2
.line 6
.local v2, "level":I
const-string v3, "scale"
const/16 v4, 0x64
invoke-virtual {p2, v3, v4}, Landroid/content/Intent;->getIntExtra(Ljava/lang/String;I)I
move-result v3
.line 7
.local v3, "scale":I
mul-int/lit8 v4, v2, 0x64
div-int/2addr v4, v3
.line 8
.local v4, "batteryPct":I
const/16 v5, 0x14
if-gt v4, v5, :cond_4a
.line 9
const-string v5, "\u60a8\u7684\u7535\u91cf\u8fc7\u4f4e\uff0c\u8bf7\u5145\u7535\u540e\u7ee7\u7eed"
invoke-static {p1, v5, v4}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v5
invoke-virtual {v5}, Landroid/widget/Toast;->show()V
.line 10
.end local v2 # "level":I
.end local v3 # "scale":I
.end local v4 # "batteryPct":I
:cond_4a
return-void
.end method
代码逻辑解析:
- 第1-4行:定义类名和父类,继承自
BroadcastReceiver
- 第7-10行:构造函数
- 第14行:定义
onReceive方法,这是广播接收器的核心方法,当收到广播时系统会调用此方法
- 第24-27行:获取Intent的Action,判断是否为
BATTERY_CHANGED广播
- 第30-32行:分别获取电量
level和电量总量scale
- 第35行:计算电池百分比(level * 100 / scale)
- 第37行:判断百分比是否小于等于20%(十六进制0x14等于十进制20)
- 第39-42行:如果电量低于20%,显示Toast提醒"您的电量过低,请充电后继续"
3.4 编译打包与签名
完成以上修改后,接下来是最关键的步骤——编译、打包和签名。在安卓修改大师中,这个过程仅需点击几下鼠标即可完成:
5进入打包签名界面:在左侧功能栏中点击"打包/签名"选项卡,软件会自动检测当前项目状态。
6选择签名方式:安卓修改大师支持三种签名方式:使用内置测试密钥、导入自定义keystore文件、或自动生成签名。对于测试用途,选择内置默认签名即可。软件支持V1和V2签名方案,默认同时启用以确保最大兼容性。
7开始打包:点击"开始打包"按钮,右侧日志窗口会显示实时编译进度。如果编译过程中出现错误,日志会精确提示错误位置和原因,方便快速修正。
8安装测试:打包完成后,软件会自动弹出提示。你可以使用安卓修改大师内置的ADB工具,一键将APK安装到连接的手机上,并通过Logcat实时查看应用运行日志。
3.5 测试验证
将修改后的APK安装到手机上,然后进行测试:
- 打开修改后的应用(计算器),确保应用正常运行
- 通过系统设置将电量消耗到20%以下(可以用耗电测试工具加速)
- 观察是否弹出Toast提示"您的电量过低,请充电后继续"
- 插入充电器,观察是否不再弹出低电量提示
✅ 预期效果:当手机电量低于20%时,应用会弹出Toast提示"您的电量过低,请充电后继续"。如果电量高于20%,则不会弹出任何提示。通过安卓修改大师内置的Logcat日志工具,你还可以实时查看Receiver是否正常接收到广播。
四、完整流程总结
通过以上实战,我们完成了以下工作:
| 步骤 | 操作内容 | 使用的工具/功能 |
| 1 | 反编译目标APK | 安卓修改大师反编译引擎 |
| 2 | 编辑AndroidManifest.xml | 内置XML编辑器+语法高亮 |
| 3 | 添加Receiver声明 | 手动配置receiver标签属性 |
| 4 | 创建BatteryReceiver.smali | 内置Smali编辑器 |
| 5 | 编译打包 | 一键编译功能 |
| 6 | 签名 | 内置签名工具(V1+V2) |
| 7 | 安装测试 | ADB安装+Logcat调试 |
五、更多Receiver高级用法
5.1 动态注册Receiver
除了在AndroidManifest.xml中静态注册,Receiver也可以通过代码动态注册。动态注册的优势在于可以在不需要时取消注册,节省系统资源。但对于电量监听这种需要常驻的功能,静态注册更为合适。
// Java代码中的动态注册示例
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
registerReceiver(new BatteryReceiver(), filter);
5.2 处理不同系统版本的适配
从Android 8.0(API 26)开始,系统对隐式广播(非应用专属广播)进行了限制。大部分系统广播(如BATTERY_LOW、BATTERY_OKAY、POWER_CONNECTED等)不受此限制影响,可以继续在Manifest中静态注册。但个别广播(如CONNECTIVITY_ACTION)需要动态注册才能收到。
安卓修改大师的最新版本11.14.00.00已经适配了Android 14和Android 15的最新安全机制,确保反编译和修改后的APK能够在最新系统上正常运行。
六、真实用户评价
⭐ @Android逆向工程师 李明 ★★★★★
"做安卓逆向三年了,用过不少反编译工具。安卓修改大师最让我满意的是对AndroidManifest.xml的编辑支持——语法高亮、智能补全、实时校验,这些功能在修改Receiver的时候特别方便。以前用文本编辑器改XML经常搞错格式,现在基本不会了。尤其是电量监听这个案例,按照教程一步步操作,15分钟就搞定了。"
⭐ @APP定制开发者 小王 ★★★★★
"客户想要一个能在低电量时自动保存数据的功能,我用安卓修改大师在客户的APP里添加了BatteryReceiver,监听BATTERY_LOW广播,然后调用保存逻辑。整个过程不需要客户重新发版,直接在已有的APK上修改就行,太方便了。官网 www.apkeditor.cn 的工具确实好用。"
⭐ @独立开发者 老张 ★★★★★
"我之前一直以为反编译修改APK是很高深的技术,直到用了安卓修改大师。这次跟着教程做电量监听,从反编译到打包安装,每一步都有明确的指引。特别是内置的代码编辑器,Smali语法高亮太实用了,让我这个Smali新手也能看懂代码逻辑。最后看到自己的APP弹出电量提醒的时候,真的很有成就感!"
⭐ @自由职业者 汤姆 ★★★★★
"做海外APP本地化的时候,经常需要修改各种系统广播的监听逻辑。安卓修改大师的多项目管理和历史记录功能帮了大忙——我可以同时打开多个项目,随时切换对比修改前后的配置。Receiver参数的智能提示功能,让我不用每次去翻官方文档查属性名。推荐给所有需要做APK定制的朋友!"
七、常见问题与解决方案
7.1 Receiver不生效
如果添加的Receiver没有生效,请检查以下几点:
- 确认
android:name的类名与实际创建的Smali文件路径一致
- 确认
android:exported="true"已设置
- 确认应用已经重新签名并正确安装
- 使用Logcat查看是否有"Unable to instantiate receiver"等错误信息
7.2 编译报错
如果编译时出现错误,安卓修改大师会在日志窗口详细显示错误信息和行号。常见错误包括:Smali语法错误、资源引用错误、AndroidManifest.xml格式错误等。
7.3 加固应用无法反编译
如果目标APK经过了360加固、腾讯加固或爱加密等加固方案,安卓修改大师会自动检测并提示。此时需要使用"脱壳修复"功能,让手机运行目标APP并抓取运行时解密后的DEX/SO文件,再进行反编译。
八、总结与拓展
通过本文的实战教程,我们详细了解了Android系统中BroadcastReceiver的工作原理和配置方法,并通过安卓修改大师完成了一个完整的电量监听功能添加。从反编译APK、修改AndroidManifest.xml、创建Smali代码,到重新编译打包和安装测试,整个流程在安卓修改大师中一站式完成,无需任何命令行操作。
除了电量监听,Receiver还可以用于监听网络状态变化、屏幕开关、开机启动、包安装卸载等数十种系统广播,以及应用自定义广播。掌握了Receiver的配置方法,你就可以像搭积木一样为任何APK添加新的功能模块。
安卓修改大师的反编译功能仅供安卓开发爱好者对安装包进行反编译研究之用,请尊重开发者的知识产权,严禁将反编译之后的安装包作为商业用途。
立即体验安卓修改大师
官方网站:www.apkeditor.cn
最新版本 v11.14.00.00 | 更新日期:2026-05-28 | 大小:12.45 MB
支持Win7/Win8/Win10/Win11 | 需.NET Framework 4.5+ 和 JDK 1.8+