Android学习之四大组件(四)——BroadcastReceiver

简介: 1.系统广播BroadcastReceiver是一种负责接收广播消息并对消息做出响应的组件,它和Service一样,并不提供与用户交互的UI界面。

1.系统广播

BroadcastReceiver是一种负责接收广播消息并对消息做出响应的组件,它和Service一样,并不提供与用户交互的UI界面。

在Android系统中存在许多标准的广播动作,其中常见的有以下一些:

(1)Intent.ACTION_CAMERA_BUTTON; //按下拍照按键

(2)Intent.ACTION_DATA_CHANGED; //设备日期发生改变

(3)Intent.ACTION_TIME_CHANGED;   //设置时间发生改变

(4)Intent.ACTION_TIMEZONE_CHANGED; //时区发生改变

(5)Intent.ACTION_BOOT_COMPLETED; //系统启动完成

(6)Intent.ACTION_PACKAGE_ADDED; //成功安装APK

(7)Intent.ACTION_PACKAGE_CHANGED; //已安装的APK被改变

(8)Intent.ACTION_PACKAGE_REMOVED; //删除APK

(9)Intent.ACTION_PACKAGE_DATA_CLEARED;     //清除应用程序的数据

(10)Intent.ACTION_BATIERY_LOW;   //电池电量低

(11)Intent.ACTION_BATIERY_CHANGED; //充电状态电池电量发生变化

(12)Intent.ACTION_POWER_CONNECTED; //连接外部电源

(13)Intent.ACTION_POWER_DISCONNECTED;     //断开外部电源

(14)Intent.ACTION_HEADSET_PLUG;      //插入耳机

(15)Intent.ACTION_INPUT_METHOD_CHANGED; //输入法改变

(16)Intent.ACTION_MEDIA_CHECKING; //插入外部储存设备进行检测

(17)Intent.ACTION_MEDIA_MOUNTED;   //外部存储设备Mount成功

(18)Intent.ACTION_MEDIA_REMOVED;   //外部存储设备移除

(19)Intent.ACTION_SCREEN_OFF;    //屏幕关闭

(20)Intent.ACTION_SCREEN_ON;     //屏幕打开

(21)Intent.ACTION_SHUTDOWN;   //关闭系统

以上这些都是Android系统中内置的一些广播动作,我们可以直接在我们的应用程序中接收这些广播动作,并根据所接收到的不同广播做出相应的处理。

 

2.发布广播

除了以上介绍的这些Android系统内置的广播之外,如果我们想要在自己的应用程序中创建并发布一个自定义的广播也是很容易的。

广播的内容和用于过滤广播的动作是携带在Intent对象中被发送出去的,所以我们可以通过Intent类提供的putExtra()方法向Intent对象中加入广播内容,通过Intent类提供的setAction()方法向Intent对象中加入过滤广播的动作。具体实现方法如下代码所示:

 1     /*
 2      * Function  :    点击事件处理
 3      * Author    :    博客园-依旧淡然
 4      */
 5     public void onClick(View view) {
 6         switch(view.getId()) {
 7         case R.id.button:
 8             Intent intent = new Intent();               //创建Intent对象
 9             intent.setAction(MY_ACTION);               //设置Intent对象的Action属性
10             intent.putExtra("key_msg", mEditText.getText().toString());    //向Intent对象中添加广播内容
11             sendBroadcast(intent);                      //发送广播
12             break;
13         }
14     }

在以上的代码中,我们通过setAction()方法向Intent对象中加入了过滤广播的动作,这个动作是我们自定义的,像Android中内置的广播动作一样,这个动作可以用来唯一的识别我们自定义的广播。这里我将该动作定义如下:

  private static final String MY_ACTION = "com.example.android_broadcast.msg";

此外,我们通过putExtra()方法向Intent对象中加入了广播的内容,其中广播的内容是EditText控件中的输入内容。putExtra()方法提供了以键值对的形式存储数据。

最后,我们通过sendBroadcast()方法,将携带有广播信息的Intent对象发送出去即可。

需要注意的一点是,在Context类中提供了3种方式发送广播,分别是:

(1)Context.sendBroadcast();

(2)Context.sendStickyBroadcast();

(3)Context.sendOrderedBroadcast();

其中,使用sendBroadcast()方式发送出去的Intent,所有满足条件的BroadcastReceiver都会执行其onReceive()方法,但是如果有多个满足条件的BroadcastReceiver,那么其执行onReceive()方法的顺序则是不一定的。

使用sendStickyBroadcast()方式发送出去的Intent会一直存在,并且在以后如果调用registerReceive()方法注册一个满足条件的BroadcastReceiver时,Intent对象会直接返回给新注册的BroadcastReceiver。

使用sendOrderedBroadcast()方式发送出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行onReceive()方法,但是相同优先级的BroadcastReceiver执行onReceive()方法的顺序是不一定的。

3.接收广播

如果在我们的应用程序中需要接收某个广播(Android内置的广播或我们自定义的广播),并对接收到的广播进行相应的处理,那么我们需要创建一个BroadcastReceiver类(继承自android.Content.BroadcastReceiver类),并实现BroadcastReceiver类的onReceive()方法。BroadcastReceiver类中的onReceive()方法在接收到发给自己的广播时会被调用。

除此之外,我们还需要对我们创建的BroadcastReceiver类进行注册,注册的方式有两种:一种是在AndroidManifest.xml文件中注册BroadcastReceiver,另一种是直接在代码中通过registerReceive()方法注册BroadcastReceiver。

下面就分别说说这两种方式都是如何实现的。

3.1在AndroidManifest.xml文件中注册BroadcastReceiver

首先,我们需要创建一个BroadcastReceiver类,用来接收并处理刚才发布的广播信息,具体如下代码所示:

 1   /*
 2    * Class     :  BroadcastReceiver类,用于接收并处理广播信息
 3    * Author    :  博客园-依旧淡然
 4    */
 5   public class MyBroadcastReceiver extends BroadcastReceiver {
 6   
 7       @Override
 8       public void onReceive(Context context, Intent intent) {
 9           String msg = intent.getStringExtra("key_msg");            //获取广播的内容
10           Toast.makeText(context, "接收到的广播信息为:" + msg, Toast.LENGTH_LONG).show();
11       }
12   
13   }

通过以上的代码,我们创建了一个名为“MyBroadcastReceiver”的BroadcastReceiver 类,在onReceive()方法中取出了广播的内容,并将其显示出来。

完成了MyBroadcastReceiver的代码编写之后,还需要在AndroidManifest.xml文件中注册该组件。具体方法如下所示:

1     <receiver 
2         android:name=".MyBroadcastReceiver">
3         <intent-filter>
4             <action android:name="com.example.android_broadcast.msg"    />
5         </intent-filter>
6     </receiver>

<receiver></receiver>标签嵌套在<application></application>标签里,其中,android:name=".MyBroadcastReceiver"指定了所要注册的BroadcastReceiver组件的名字。<intent-filter></intent-filter>标签中的<action>标签则用于指定该BroadcastReceiver组件的过滤规则。可以看到,该标签中的android:name="com.example.android_broadcast.msg",正是我们之前定义的广播动作。由此,便唯一的确定了MyBroadcastReceiver所要响应的是哪一个广播动作。

3.2通过registerReceive()方法注册BroadcastReceiver

在Activity中,我们也可以直接在onStart()方法中通过调用registerReceiver()方法注册BroadcastReceiver,在onStop()方法中通过调用unregisterReceiver()方法解除对BroadcastReceiver的注册,如下代码所示:

 1     /*
 2      * Function  :    onStart()方法
 3      * Author    :    博客园-依旧淡然
 4      */
 5     protected void onStart() {
 6         super.onStart();
 7         IntentFilter intentFilter = new IntentFilter();
 8         intentFilter.addAction(MY_ACTION);                    //设置Action
 9         registerReceiver(myBroadcastReceiver, intentFilter);    //注册BroadcastReceiver组件
10     }
11 
12     /*
13      * Function  :    onStop()方法
14      * Author    :    博客园-依旧淡然
15      */
16     protected void onStop() {
17         unregisterReceiver(myBroadcastReceiver);        //解除注册BroadcastReceiver组件
18         super.onStop();
19     }

需要注意的一点是,如果你是在Activity的onResume()方法中注册BroadcastReceiver的,那么就需要在Activity的onPause()方法中解除对BroadcastReceiver的注册。

3.3注册广播的两种方式的区别

在AndroidManifest.xml文件中注册的BroadcastReceiver,属于常驻型广播,即使应用程序关闭了,如果有广播信息来,所创建的BroadcastReceiver同样能够接收到。所以这是一种静态注册广播的形式。

通过registerReceive()方法注册的BroadcastReceiver,属于非常驻型广播,通常在Activity结束时就会调用unregisterReceiver()方法解除BroadcastReceiver。所以这是一种动态注册广播的形式。

相关文章
|
4天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
76 0
|
2月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
176 5
|
1月前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
44 0
|
2月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
2月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序