首页 > 其他分享 >Android广播接收器详解

Android广播接收器详解

时间:2023-09-14 17:02:11浏览次数:36  
标签:接收器 应用程序 发送 广播 详解 注册 ACTION Android

1. Android广播接收器简介

在 Android 中,BroadcastReceiver(广播接收器)是一种组件,用于监听系统广播或应用程序内自定义广播,并在广播发生时接收并处理这些广播。广播接收器可以用于实现组件之间的通信,无论是在同一个应用程序内还是在不同应用程序之间。

广播接收器有两个主要部分:

  1. 注册广播接收器:在 AndroidManifest.xml 文件中声明广播接收器,或者通过代码动态注册广播接收器。这样系统或其他应用程序发送匹配的广播时,广播接收器就会被激活。
  2. 处理广播:广播接收器在接收到广播时,会调用其 onReceive(Context context, Intent intent) 方法。在这个方法中,可以处理接收到的广播,例如读取广播中的数据、执行特定操作或触发其他组件的响应。

以下是一个简单的示例,展示了如何创建一个广播接收器:

// 示例广播接收器类
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.example.myapp.MY_CUSTOM_ACTION")) {
            // 处理自定义广播
            String message = intent.getStringExtra("message");
            Toast.makeText(context, "Received broadcast: " + message, Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            // 处理系统广播:插入电源
            Toast.makeText(context, "Power connected!", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            // 处理系统广播:拔出电源
            Toast.makeText(context, "Power disconnected!", Toast.LENGTH_SHORT).show();
        }
    }
}

在上述示例中,我们创建了一个广播接收器 MyBroadcastReceiver,并重写了 onReceive() 方法。根据接收到的广播的 Action(动作),我们在方法中处理不同类型的广播。对于自定义广播,我们从 Intent 中获取消息数据,并显示一个 Toast。对于系统广播 Intent.ACTION_POWER_CONNECTEDIntent.ACTION_POWER_DISCONNECTED,我们也分别显示相应的 Toast。

要使广播接收器能够接收广播,我们需要在 AndroidManifest.xml 文件中声明广播接收器:

<receiver android:name=".MyBroadcastReceiver">
    <!-- 过滤器,指定要监听的广播 -->
    <intent-filter>
        <!-- 自定义广播 -->
        <action android:name="com.example.myapp.MY_CUSTOM_ACTION" />
        <!-- 系统广播:插入电源和拔出电源 -->
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    </intent-filter>
</receiver>

上述代码中,我们在 <receiver> 标签中声明了 MyBroadcastReceiver 广播接收器,并在 <intent-filter> 标签中指定了要监听的广播。这样,MyBroadcastReceiver 就会接收来自 com.example.myapp.MY_CUSTOM_ACTIONIntent.ACTION_POWER_CONNECTEDIntent.ACTION_POWER_DISCONNECTED 的广播。

通过广播接收器,Android 应用程序可以实现不同组件之间的通信和响应,以及对系统广播的监听和处理。广播接收器是一种强大的机制,但在使用时需要注意潜在的性能和安全问题,尽量避免过多地频繁发送广播,以免造成不必要的资源浪费。

2. 广播接收器 静态注册 和 动态注册

在 Android 中,广播接收器(BroadcastReceiver)可以通过两种方式进行注册:静态注册和动态注册。

  1. 静态注册:
  • 静态注册是在 AndroidManifest.xml 文件中声明广播接收器。这意味着广播接收器在应用程序安装时就被注册,不需要在运行时手动注册或注销。
  • 静态注册适用于监听全局广播或在应用程序的整个生命周期内都需要接收广播的场景。当应用程序处于非运行状态时,静态注册的广播接收器仍然可以接收到广播。

示例:在 AndroidManifest.xml 中静态注册广播接收器

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <!-- 添加其他你要监听的广播动作 -->
    </intent-filter>
</receiver>
  1. 动态注册:
  • 动态注册是在代码中通过 Java 来注册广播接收器。这意味着广播接收器在运行时需要手动注册和注销,通常是在特定的时刻注册或在特定的页面/组件中注册。
  • 动态注册适用于临时性的广播接收需求,比如只在特定条件下监听广播,或者在特定 Activity/Fragment 中监听广播。

示例:在代码中动态注册广播接收器

public class MyActivity extends AppCompatActivity {
    private MyBroadcastReceiver myBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建广播接收器实例
        myBroadcastReceiver = new MyBroadcastReceiver();

        // 创建 IntentFilter,指定要监听的广播动作
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.myapp.MY_CUSTOM_ACTION");
        // 添加其他你要监听的广播动作

        // 注册广播接收器
        registerReceiver(myBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播接收器
        unregisterReceiver(myBroadcastReceiver);
    }
}

需要注意的是,静态注册和动态注册的广播接收器都有各自的适用场景和优缺点。静态注册的广播接收器在应用程序安装时就会注册,无需额外的代码来注册和注销,但它会增加应用程序启动时间和资源占用。而动态注册的广播接收器需要在适当的时机手动注册和注销,相对灵活,但也需要开发者自行管理注册和注销的时机,避免在不需要接收广播时仍然保持注册状态。

开发者应根据具体的需求和场景,选择适合的注册方式来使用广播接收器。

3. 常见系统广播

在 Android 系统中,有许多常用的系统广播,它们可以用于监听设备状态的变化以及接收系统级事件。以下是一些常用的系统广播:

  1. ACTION_BOOT_COMPLETED:当设备完成启动过程后发送此广播。可以在接收此广播后执行一些初始化操作。
  2. ACTION_POWER_CONNECTED:当设备连接电源时发送此广播。
  3. ACTION_POWER_DISCONNECTED:当设备断开电源连接时发送此广播。
  4. ACTION_BATTERY_LOW:当设备电量低于警告阈值时发送此广播。
  5. ACTION_BATTERY_OKAY:当设备电量恢复正常时发送此广播,即设备不再处于低电量状态。
  6. ACTION_SCREEN_ON:当设备的屏幕点亮时发送此广播。
  7. ACTION_SCREEN_OFF:当设备的屏幕关闭时发送此广播。
  8. ACTION_USER_PRESENT:当用户解锁设备并进入主屏幕时发送此广播。
  9. ACTION_TIME_TICK:每分钟发送一次的广播,可以用于更新 UI 中的时间显示。
  10. ACTION_PACKAGE_ADDED:当安装新应用程序时发送此广播。
  11. ACTION_PACKAGE_REMOVED:当卸载应用程序时发送此广播。
  12. ACTION_PACKAGE_REPLACED:当替换安装应用程序时发送此广播。
  13. ACTION_MEDIA_MOUNTED:当外部存储设备(如SD卡)被挂载时发送此广播。
  14. ACTION_MEDIA_UNMOUNTED:当外部存储设备被卸载时发送此广播。
  15. ACTION_HEADSET_PLUG:当耳机插入或拔出时发送此广播。
  16. ACTION_NEW_OUTGOING_CALL:当拨打新电话时发送此广播。
  17. ACTION_ANSWER:当接听电话时发送此广播。
  18. ACTION_CALL_STATE_CHANGED:当电话状态(响铃、接听、挂断等)发生变化时发送此广播。

这些广播可以通过静态注册或动态注册的方式来监听,从而在合适的时机做出相应的响应。注意,不同的 Android 版本可能会有不同的广播行为,因此建议在使用时查阅最新的 Android 官方文档来获取准确的信息。


标签:接收器,应用程序,发送,广播,详解,注册,ACTION,Android
From: https://blog.51cto.com/u_16175630/7471674

相关文章

  • Android软键盘弹出关闭监听
    https://juejin.cn/post/6844903489051557902?from=singlemessage&isappinstalled=0#commentpackagecom.xiucai.common.manager;importandroid.graphics.Rect;importandroid.util.Log;importandroid.view.View;importandroid.view.ViewTreeObserver;import......
  • idea 配置详解 (二) Editor
    (3.File|Settings|Editor)3.1File|Settings|Editor|GeneralMouseControl:第一个复选框选中时可以鼠标滑动滚轮改变字体的大小不想要的可以不选第二个复选框选中之后可以拖动代码片段取消勾选可以禁用​SoftWraps:选中第一个复选框时可将软包装应用到特定文......
  • Springcloud 详解
     【SpringCloud】快速入门(一)-H__D-博客园(cnblogs.com)【SpringCloud】Eureka注册中心(二)-H__D-博客园(cnblogs.com)【SpringCloud】服务提供者集群与服务发现Discovery(三)-H__D-博客园(cnblogs.com)【SpringCloud】ZooKeeper注册中心(四)-H__D-博客园(cnblo......
  • MyBatis框架详解:一个高效、灵活且易于使用的ORM框架
    MyBatis(原名ibatis)是一个基于Java语言的ORM(对象关系映射)框架,可以将数据库表中的数据转换成Java对象,也可以将Java对象中的数据插入到数据库表中。它采用了数据映射文件和注解两种方式来实现数据的映射,可以方便地管理SQL语句和实体类之间的关系。灵活性相比于其他ORM框架,MyBatis更加......
  • Android Studio中无法显示main.dart(Flutter项目在Android Studio中显示不全)
    问题描述创建完项目后只出现android文件选择ProjectFiles就会显示整个目录内容设置后......
  • Java动态代理详解
    不定期整理硬盘内源代码、笔记、总结等,同时发上来分享一下。今天再发一篇关于Java动态代理的总结(貌似ItEye一天最多发5篇Blog,再多只能放草稿箱了?)-----------------------------------------------------------Java动态代理详解说到动态代理,顾名思义就是动态的代理(真是废话)。关......
  • android短视频开发,scroll-view的横向滚动
    android短视频开发,scroll-view的横向滚动css .scrollCon{white-space:nowrap;display:flex;align-items:center;}.monthItem{display:inline-block;width:calc(100%/6);font-size:26rpx;color:#3D3D3D;text-align:center;}​总结: 核心css关键点 scroll-view......
  • MySQL篇:第三章_详解DQL语言
    DQL语言的学习基础查询一、语法:SELECT要查询的东西【FROM表名】;类似于Java中:System.out.println(要打印的东西);特点:①通过select查询完的结果,是一个虚拟的表格,不是真实存在②要查询的东西可以是常量值、可以是表达式、可以是字段、可以是函数二、特点1、查询......
  • Android inject详解
    本篇Blog源于我在上一家互联网公司工作中的一项任务,前几天原来公司的一个同事让我整理个文档出来学习一下。今天写完文档后我决定再分享到Blog上一份。希望对需要的人有所帮助,或者能够激发读者的创意。作者shensy----------------------------------------------------------------......
  • SimpleDateFormat详解
    publicclassSimpleDateFormatextendsDateFormatSimpleDateFormat是一个以国别敏感的方式格式化和分析数据的具体类。它允许格式化(date->text)、语法分析(text->date)和标准化。SimpleDateFormat允许以为日期-时间格式化选择任何用户指定的方式启动。但是,希望用......