安卓修改大师:Receiver属性详解与屏幕亮灭监听实战

安卓修改大师:Receiver属性详解与屏幕亮灭监听实战

简介

安卓修改大师(官网 www.apkeditor.cn)是一款功能强大的APK反编译与定制工具,无需编程基础即可轻松修改APK中的任何资源与代码。本文将详细解析AndroidManifest.xml中<receiver>标签的所有属性含义与功能,并结合实战案例,演示如何使用安卓修改大师在APK中添加一个BroadcastReceiver,实现检测屏幕亮灭状态并弹出Toast提示。文章将从反编译、代码注入到重新打包签名,完整展示安卓修改大师的便捷操作流程。


一、BroadcastReceiver概述

BroadcastReceiver(广播接收器)是Android四大组件之一,它作用于应用内、进程间重要的一种通信方式,能够将某个消息通过广播的形式传递给订阅的广播接收器中。BroadcastReceiver分为发送者和接收者,可实现跨应用的消息传递。重启手机、闹钟、来电、接收短信等都会发出广播,通过BroadcastReceiver就可以接收广播并进行相应处理。

在Android系统中,广播接收器有两种注册方式:静态注册和动态注册。静态注册是指在AndroidManifest.xml中声明<receiver>标签,动态注册则是在代码中通过registerReceiver()方法实现。本文将重点介绍静态注册方式,因为这种方式可以通过安卓修改大师直接修改XML文件来实现,无需编写Java代码。

📌 用户好评:"用安卓修改大师做了好几个项目了,反编译后直接修改XML添加广播接收器,比从零开始写代码快多了。特别是监听系统广播的场景,几行配置就搞定,太方便了!"------来自官网用户评论


二、Receiver标签属性详解

<receiver>标签用于在AndroidManifest.xml中声明一个广播接收器,它是BroadcastReceiver的子类,作为应用程序的一个组件。广播接收器使应用程序能够接收由系统或其他应用程序广播的Intent,即使应用程序的其他组件未在运行。

以下是<receiver>标签支持的所有核心属性,每个属性都有其特定的功能和应用场景:

2.1 android:name ------ 广播接收器类名

含义:指定实现广播接收器的类名,必须是BroadcastReceiver的子类。

功能 :这是<receiver>标签最核心的属性,告诉系统当广播到来时应该实例化哪个类来处理。通常使用类的全名(如com.example.project.ReportReceiver)来设置,也可以使用简写(如.ReportReceiver),系统会自动把<manifest>元素中的package属性所设定的包名添加到这个简写的名称上。

示例:

xml 复制代码
<receiver android:name=".ScreenStateReceiver" />

2.2 android:exported ------ 是否接收外部广播

含义:指示该广播接收器是否能够接收来自应用程序外部的消息。

功能 :如果设置为true,则能够接收来自其他应用或系统的广播;如果设置为false,则只能接收来自相同应用程序组件或带有相同用户ID的应用程序所发出的消息。这个属性是安全控制的重要手段。

默认值 :它的默认值依赖它所包含的Intent过滤器。如果不包含过滤器,则接收器只能由指定了明确类名的Intent对象来调用,默认值就是false。如果接受器至少包含了一个过滤器,那么就意味着这个接收器能够接收来自系统或其他应用程序的Intent对象,因此默认值是true。

示例:

xml 复制代码
<receiver 
    android:name=".ScreenStateReceiver"
    android:exported="true" />

2.3 android:enabled ------ 是否可实例化

含义:用于定义系统是否能够实例化这个广播接收器。

功能 :如果设置为true,则能够实例化;如果设置为false,则不能被实例化。<application>元素有它自己的enabled属性,这个属性会应用给应用程序的所有组件,包括广播接收器。<application>和<receiver>元素的这个属性都必须是true,这个广播接收器才能够被启用。

默认值 :true。

2.4 android:permission ------ 权限控制

含义:用于定义把消息发送给该广播接收器的广播器所必须要有的权限。

功能 :这是一个安全机制,只有持有指定权限的应用才能向该接收器发送广播。如果没有设置这个属性,那么<application>元素的permission属性所设置的权限就适用于这个广播接收器。如果<application>元素也没有设置权限,那么该接收器就不受权限的保护。

2.5 android:process ------ 进程设置

含义:用于设置该广播接收器应该运行在哪个进程中的进程名。

功能 :通常情况下,应用程序的所有组件都在给应用程序创建的默认进程中运行,它有与应用程序包名相同的名称。<application>元素的process属性能够给它的所有组件设置一个不同的默认进程,但是它的每个组件自己的process属性能够覆盖这个默认设置,这样就允许把一个应用程序分离到多个进程中。

2.6 android:icon ------ 图标

含义:定义了一个代表广播接收器的图标。

功能 :这个属性必须用包含图片定义的可绘制资源来设定。如果没有设置这个属性,会是<application>元素的icon属性值来代替。无论是这个属性还是<application>元素的icon属性,它们设置的图标也是所有的接收器的Intent过滤器的默认图标。

2.7 android:label ------ 标签

含义:给广播接收器设定一个用户可读的文本标签。

功能 :如果这个属性没有设置,那么就会使用<application>元素的label属性值来代替。应该使用一个字符串资源来设置这个属性,以便它能够像用户界面中的其他字符串一样能够被本地化。

2.8 android:directBootAware ------ 直接启动感知

含义:指示广播接收器是否支持直接启动模式(Direct-Boot aware)。

功能 :如果设置为true,该广播接收器可以在用户解锁设备之前运行。需要注意的是,在直接启动期间,应用程序中的广播接收器只能访问存储在设备保护存储区中的数据。默认值为false。

2.9 IntentFilter ------ 意图过滤器

<intent-filter>是<receiver>的子元素,用于指定该广播接收器要接收哪些类型的广播。通过设置<action>来匹配特定的广播动作。

示例:

xml 复制代码
<receiver android:name=".ScreenStateReceiver">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_ON" />
        <action android:name="android.intent.action.SCREEN_OFF" />
    </intent-filter>
</receiver>

三、Receiver属性的完整配置示例

将上述所有属性综合起来,一个完整的<receiver>声明如下所示:

xml 复制代码
<receiver 
    android:name=".ScreenStateReceiver"
    android:enabled="true"
    android:exported="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/receiver_label"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
    android:process=":receiver_process"
    android:directBootAware="false">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_ON" />
        <action android:name="android.intent.action.SCREEN_OFF" />
    </intent-filter>
</receiver>

四、BroadcastReceiver的调用方式

BroadcastReceiver的调用方式主要有以下几种:

4.1 静态注册(Manifest注册)

在AndroidManifest.xml中通过<receiver>标签声明,系统在安装应用时就会解析并注册。这种方式的优点是即使应用未运行,也能接收广播。

操作流程:在<application>标签内添加<receiver>子标签,配置android:name属性和<intent-filter>,指定要接收的广播动作。

4.2 动态注册(代码注册)

在Java/Kotlin代码中通过registerReceiver()方法注册,需要在合适的时机调用unregisterReceiver()取消注册,一般在生命周期的onDestroy()方法中执行。

动态注册示例代码:

java 复制代码
// 初始化过滤器
IntentFilter intentFilter = new IntentFilter();
// 在过滤器中添加action
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
// 注册广播
registerReceiver(screenReceiver, intentFilter);

4.3 系统广播的发送机制

当系统或应用发送广播时,Android系统会通过Binder机制通知AMS(Activity Manager Service),AMS查找已注册的接收器,然后通过IIntentReceiver接口分发广播。最终,广播接收器的onReceive()方法会被调用。


五、实战案例:使用安卓修改大师添加屏幕亮灭监听

本章节将手把手演示如何使用安卓修改大师,在任意APK中添加一个BroadcastReceiver,实现检测屏幕点亮和熄灭的功能。当屏幕点亮时,弹出Toast提示"屏幕点亮了"。

5.1 准备工作

  1. 从官网 www.apkeditor.cn 下载并安装安卓修改大师(最新版本11.14.00.00)
  2. 准备一个未加固的目标APK文件
  3. 确保电脑已安装.NET Framework 4.0+和JDK 1.8+

5.2 第一步:反编译目标APK

启动安卓修改大师,将目标APK文件拖拽到软件界面中。在弹出的反编译选项窗口中,选择**"完整反编译(包括代码反编译)"**,因为我们需要添加Smali代码来实现Toast功能。

反编译完成后,软件会以树形目录展示项目结构,包括res/、smali/、AndroidManifest.xml等核心目录。

💡 小贴士:如果只需要修改XML和添加资源,可以选择"仅反编译资源",但本案例需要添加Smali代码,因此必须选择完整反编译。

5.3 第二步:创建ScreenStateReceiver的Smali代码

在smali/目录下,找到与应用包名对应的目录(例如com/example/app/),我们需要在这里创建一个新的Smali文件ScreenStateReceiver.smali。

首先,我们需要了解BroadcastReceiver在Smali中的实现方式。一个基本的BroadcastReceiver的Smali代码如下:

smali 复制代码
.class public Lcom/example/app/ScreenStateReceiver;
.super Landroid/content/BroadcastReceiver;
.source "ScreenStateReceiver.java"

# direct methods
.method public constructor <init>()V
    .registers 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 6
    .param p1, "context"    # Landroid/content/Context;
    .param p2, "intent"     # Landroid/content/Intent;

    .prologue
    .line 10
    invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;
    move-result-object v0

    .line 12
    .local v0, "action":Ljava/lang/String;
    const-string v1, "android.intent.action.SCREEN_ON"

    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    move-result v1

    if-eqz v1, :cond_1a

    .line 14
    const-string v1, "\u5c4f\u5e55\u70b9\u4eae\u4e86"

    const/4 v2, 0x0

    invoke-static {p1, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v1

    invoke-virtual {v1}, Landroid/widget/Toast;->show()V

    .line 17
    :cond_1a
    return-void
.end method

代码说明:

  • onReceive方法接收两个参数:Context和Intent
  • 通过intent.getAction()获取广播的动作
  • 判断动作是否为android.intent.action.SCREEN_ON
  • 如果是,则调用Toast.makeText()显示"屏幕点亮了"
  • 第3个参数0表示Toast.LENGTH_SHORT

使用安卓修改大师的"Smali转换"工具,可以将Java代码快速转换为Smali,大大提高了开发效率。

5.4 第三步:修改AndroidManifest.xml添加Receiver声明

在反编译后的项目中找到AndroidManifest.xml文件,双击打开。在<application>标签内部,找到合适的位置(通常在<activity>标签之后),添加以下<receiver>声明:

xml 复制代码
<receiver 
    android:name=".ScreenStateReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_ON" />
        <action android:name="android.intent.action.SCREEN_OFF" />
    </intent-filter>
</receiver>

关键点说明:

  • android:name必须与Smali文件的类名对应,这里使用简写.ScreenStateReceiver,系统会自动加上包名
  • android:exported="true"允许接收系统广播,因为SCREEN_ON和SCREEN_OFF是系统发出的广播
  • 在<intent-filter>中添加了两个action:SCREEN_ON和SCREEN_OFF,分别对应屏幕点亮和熄灭

5.5 第四步:添加必要的权限

如果目标应用没有声明接收系统广播所需的权限,需要在AndroidManifest.xml中添加:

xml 复制代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

虽然SCREEN_ON和SCREEN_OFF广播不需要特殊权限,但添加此项权限可以提高兼容性。同时,为了确保应用能够正常显示Toast,建议保留Toast所需的常规权限。

5.6 第五步:重新打包签名

完成以上修改后,点击安卓修改大师左侧的"打包/签名"选项卡。选择默认签名或导入自定义签名文件,点击"开始打包"。软件会自动完成资源编译、代码编译、打包、对齐和签名等所有步骤。

打包完成后,点击"安装到手机"按钮,或者手动将生成的APK文件安装到模拟器或真机上进行测试。打开应用后,按下电源键熄灭屏幕再点亮,应该能看到"屏幕点亮了"的Toast提示。

📌 用户好评:"按照教程用安卓修改大师给一个工具APP加了屏幕亮灭监听,一次就成功了!以前自己写代码总是各种报错,用这个工具直接改XML和Smali,省去了写Java代码的麻烦,太适合我这种半路出家的了。"------来自官网用户评论


六、进阶:在Activity中动态调用Receiver

除了静态注册,我们还可以在Activity中动态注册和调用Receiver。通过安卓修改大师,可以在现有的Activity Smali代码中添加动态注册逻辑。

6.1 在Activity中动态注册Receiver的Smali代码

在Activity的onCreate方法中添加注册代码:

smali 复制代码
# 在onCreate方法中添加
.method protected onCreate(Landroid/os/Bundle;)V
    .registers 4
    
    # 原有代码...
    
    # 创建IntentFilter
    new-instance v0, Landroid/content/IntentFilter;
    invoke-direct {v0}, Landroid/content/IntentFilter;-><init>()V
    
    # 添加action
    const-string v1, "android.intent.action.SCREEN_ON"
    invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
    
    const-string v1, "android.intent.action.SCREEN_OFF"
    invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
    
    # 创建Receiver实例
    new-instance v1, Lcom/example/app/ScreenStateReceiver;
    invoke-direct {v1}, Lcom/example/app/ScreenStateReceiver;-><init>()V
    
    # 注册Receiver
    invoke-virtual {p0, v1, v0}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
    
    # 继续原有代码...
    return-void
.end method

6.2 动态注册与静态注册的对比

特性 静态注册 动态注册
注册方式 AndroidManifest.xml声明 代码中registerReceiver()
取消注册 无需取消 需要unregisterReceiver()
应用未运行时 可以接收广播 无法接收广播
生命周期 与应用共存 跟随组件生命周期
适用场景 系统广播(开机、安装等) 界面相关广播

6.3 调用Receiver的多种方式总结

  1. 通过sendBroadcast()发送普通广播:所有匹配的接收器都会接收到,异步执行,无序
  2. 通过sendOrderedBroadcast()发送有序广播:按优先级顺序传递,可被截断
  3. 通过sendStickyBroadcast()发送粘性广播:广播发送后仍然存在,新注册的接收器可以收到(Android 5.0+已弃用)
  4. 通过LocalBroadcastManager发送本地广播:只在应用内部传递,更安全高效

七、常见问题与解决方案

问题现象 可能原因 解决方案
Receiver未收到广播 AndroidManifest.xml中未正确声明,或exported属性设置错误 检查receiver配置,确保exported="true"(接收系统广播时)
Toast未显示 应用处于后台时Toast可能被限制 Android 13+对后台弹出Toast有限制,建议使用Notification替代
应用闪退 Smali代码语法错误,或类名引用错误 使用安卓修改大师的Smali语法检查功能,确认类名路径正确
修改后签名失败 资源文件存在错误 查看打包日志,根据错误提示定位问题

八、总结

通过本文的详细讲解,你已经掌握了<receiver>标签的所有核心属性及其功能,了解了静态注册和动态注册两种方式,并通过实战案例学会了使用安卓修改大师在APK中添加BroadcastReceiver实现屏幕亮灭监听。

安卓修改大师的核心优势在于:

  1. 可视化操作:无需编程基础即可修改XML和Smali代码
  2. 一站式闭环:从反编译到打包签名,所有环节在同一软件内完成
  3. 高效的Smali编辑:内置Smali语法高亮和转换工具
  4. 快速迭代:修改后即时打包测试,大幅提升开发效率

无论你是想为应用添加系统广播监听,还是需要修改现有的广播接收器逻辑,安卓修改大师都能为你提供高效、稳定的解决方案。立即从官网 www.apkeditor.cn 下载体验吧!


安卓修改大师

官方网站:www.apkeditor.cn​

最新版本:v11.14.00.00 | 更新日期:2026-05-28 | 大小:12.45 MB

开发公司:上海空宇软件科技有限公司

⚠️ 重要声明:安卓修改大师提供的反编译功能,仅供安卓开发爱好者对安装包进行反编译研究之用,严禁将反编译之后的安装包作为商业用途。


: 分析广播的registerReceiver、sendBroadcast、onReceive系统到底做了什么

: 移动开发中广播浅析

: 高效学习Android项目开发 | Broadcast(附视频限免)

: AndroidManifest.xml文件详解(receiver)

: AndroidManifest内部标签属性---一篇可能就够了

: receiver | App architecture | Android Developers

: 安卓修改大师官网

: 安卓修改大师完整使用指南

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone4 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui