首页 理论教育 如何在Android中注册广播消息接收者?

如何在Android中注册广播消息接收者?

时间:2023-06-30 理论教育 版权反馈
【摘要】:广播消息接收者用于监听广播消息,可在Android Manifest.xml文件中静态注册,也可在代码中动态注册,两种方式具有不同的作用,本实验主要在代码中注册。要实现广播消息接收者,必须继承BroadcastReceiver这个类,并且覆盖onReceive方法,该方法的第一个参数是发送广播消息的组件,第二个参数是消息广播者广播的数据。

如何在Android中注册广播消息接收者?

1.实验目的

(1)熟悉Android中广播消息接收者Broadcast Receiver的实现方法。广播消息接收者用于监听广播消息,可在Android Manifest.xml文件中静态注册,也可在代码中动态注册,两种方式具有不同的作用,本实验主要在代码中注册。

(2)掌握在Android Manifest.xml文件中定义权限的方法和意义,并通过代码实现动态提醒用户打开应用程序所用到的权限。

(3)熟悉Toast控件的使用。

(4)掌握通过layer-list和Shape实现状态栏标题栏的渐变颜色。

2.广播消息接收者

广播消息接收者是一个全局的监听器,是Android四大组件之一。要实现广播消息接收者,必须继承BroadcastReceiver这个类,并且覆盖onReceive(Context context,Intent intent)方法,该方法的第一个参数是发送广播消息的组件,第二个参数是消息广播者广播的数据。该方法若在10 s内没有执行完毕,会产生ANR(Application Not Responding,程序无响应)错误。接下来,需要注册广播消息接收者,有静态注册和动态注册两种方式,静态注册程序一启动App会一直接收广播消息,而动态注册方式只有在注册的代码被调用时才开始接收消息,而且可以通过代码取消接收广播消息。

•动态注册广播消息接收者:

•在Android Manifest.xml文件的application……/标签中静态注册广播消息接收者:

3.Toast控件

Toast是一个视图类,其通过在应用程序下方弹出提示信息的方式,快速为用户显示信息。Toast不能获得焦点,不会影响用户的输入。Toast常见的使用方式是,先通过调用自带静态方法make Text()创建一个Toast,然后通过静态方法show()显示,如下所示。

make Text()方法的入参介绍如下。

•context:指上下文或场景,即该Toast归属于哪个组件。该类是个抽象类,Activity、Service、Application都是Context的子类,所以一般在这里会传入Activity或者Service的实例,用于标识该Toast显示在哪个组件中。我们常用的start Activity()、get Resources()等方法就是这个抽象类中的抽象方法。

•text:Toast中显示的文本,CharSequence类型。CharSequence是字符串实现的一个接口,实际使用时可代入一个String对象。String、StringBuffer和StringBuilder均实现了该接口,String对象是不可变的,通常在构造字符串的过程中要用到可变的StringBuffer和StringBuilder,这里使用CharSequence可以适配多种需求。

•duration:表示弹出该Toast持续的时间。一般取值为Toast的静态常量LENGTH_SHORT或LENGTH_LONG,分别表示Toast持续2 s或3.5 s。

4.Android应用程序权限

一个应用程序需要使用Android系统功能时,需要在Android Manifest.xml文件中声明权限,在该文件的manifest……/标签中增加uses-permission……/标签,例如,在代码中增加网络使用权限的声明:

用户运行应用程序后需要打开该权限,打开权限的方式有两种,第一种是在设备安装了该应用程序后,在“Settings”|“Apps”|应用程序名称|“Permissions”中打开,第二种是通过代码动态提示用户打开权限。第二种具有更好的易用性,一般商用软件采用第二种。

动态申请权限分为以下4个步骤。

(1)通过v4扩展包下的ActivityCompat.checkSelfPermission(Context context,String permission)方法检查是否授予该权限。该方法返回值分为PackageManager.PERMISSION_DENIED和Package Manager.PERMISSION_GRANTED两种情况,即没有赋予权限取值为-1,已经赋予权限取值为0,如果已经开启则不需要用户打开该权限。

(2)如果用户没有赋予权限,可使用申请权限对话框提醒用户是否赋予权限。该功能通过v4扩展包下的ActivityCompat.request Permission(Activity activity,final String[]permissions,final int requestCode)方法实现,一般会弹出一个系统对话框,询问用户是否开启这个权限。首次出现“ALLOW”和“DENY”两个选项,选择“DENY”后,再次触发该函数会出现“Don’t ask again”复选框,如图3.1所示。该方法第二个参数是申请的权限字符串,第三个参数是请求码。

(3)获取用户授权结果。授权的结果通过回调函数onRequestPermissionsResult(int requestCode,String[]permissions,int[]grant Results)方法获取。当用户在图3.1所示的界面中选择了“ALLOW”或“DENY”后,系统会将用户选择的结果以入参形式传递进来。三个入参的含义如下所述。

•requestCode:requestPermission()方法传递过去的第三个参数,即请求码,用于标识发送的赋予权限的请求。

•permissions:request Permission()方法传递过去的第二个参数,即请求的权限,这里可以传递多个权限的申请。

•grant Results:授权的结果。如果用户选择了“ALLOW”,则grantResults取值为Package Manager.PERMISSION_GRANTED,否则取值为PackageManager.PERMISSION_DENIED。

(4)shouldShow RequestPermission Rationale(Activity activity,String permission)方法用于判断用户是否在图3.1所示的界面中选中“Don’t ask again”复选框,如果选中则返回false,否则返回true。

5.Android Shape属性

在Android中,使用Shape可定义各种各样的形状,也可定义一些图片资源。相对于PNG格式的图片,使用Shape可以减小安装包的大小,且能够更好地适配不同型号的手机

Shape可以定义控件的一些展示效果,如圆角(corners)、渐变(gradient)、填充(solid)、描边(stroke)、大小(size)、内边距(padding)等,Shape属性基本语法示例如下。

图3.1 动态授权弹出对话框

假设在res/drawable目录下已创建shape.xml文件,那么在布局某控件时引用该文件的方式如下所示(以Text View为例)。

本实验中用到了Shape的渐变,主要用了以下几种属性。

•android:startColor、android:endColor:起始和结束颜色。

•android:angle:渐变角度,必须为45的整数倍。

•android:type="linear":即线性渐变,是默认的渐变模式,“radial”为径向渐变,需要指定半径大小,如android:gradientRadius="50"。

•android:center X和android:center Y:取值范围为0~1,表示渐变中间点的位置。

6.Android layer-list基本用法

layer-list用于实现界面多个图层堆叠效果,可以获取更加丰富的界面效果。

layer-list以XML文件的方式放在drawable目录下,可以在控件的属性或样式文件中采用该文件,设置更加有特色的背景。例如,图层列表文件为mylayoutlist.xml,在布局文件中需要增加android:background="@drawable/mylayoutlist"属性。

该文件以layer-list为根节点,以item为子节点,item中放入需要展示的内容。在layer-list中可以通过item节点添加图层距离最底部图层左、上、右、下方向的4个边距等属性,来得到不同的显示效果。

7.实验界面与功能

这个程序可以监听别人发送来的短信,并且可以获取短信中的内容,主要功能如下所述。

(1)点击图3.2(a)所示的界面中的“启动短信监听”按钮,打开短信监听功能,会弹出图3.2(b)所示的权限申请对话框,若用户选择“ALLOW”,则表示赋予应用程序监听短信的权限,界面中弹出“已启动短信监听!”提示信息,按钮文字变成“解除短信监听”,如图3.2(c)所示。

图3.2 App08实验界面与功能(一)

(2)打开短信监听功能后,通过模拟器右下方的按钮打开扩展控制界面(Extended Controls),如图3.3(a)所示,单击“Phone”菜单,输入短信内容并单击“SEND MESSAGE”按钮发送短信。发送短信后模拟器会接收到短信,应用程序界面中通过Toast展示短信内容,如图3.3(b)所示。

(www.xing528.com)

图3.3 App08实验界面与功能(二)

(3)点击图3.3(b)所示的界面中的“解除短信监听”按钮后,App通过Toast控件弹出“已解除短信监听!”,如图3.4所示,并且应用程序将不再监听短信。

图3.4 App08实验界面与功能(三)

8.代码结构

本实验由两个Java类组成:SMSReceiver Activity.java和SMSReceiver.java,前者负责界面事件处理,后者负责监听短信。SMSReceiver Activity中包含5个方法,如图3.5所示。SMSReceiver这个类继承自Broadcast Receiver,并实现public void on Receive(Context context,Intent intent)方法,在该方法中获取短信内容。

图3.5 SMSReceiver Activity代码结构

9.实验步骤

步骤1:新建模块App08,将入口类命名为SMSReceiver Activity,将对应的布局文件名更改为activity_smsreceiver.xml。

步骤2:本实验用到的常量字符串如下所示。

步骤3:本实验需要将状态栏和标题栏的颜色改成渐变色,所以将color Primary和color PrimaryDark颜色常量改成透明色,这两个颜色分别为标题栏和状态栏的颜色,再定义从左到右渐变的两个颜色,用到的颜色常量如下所示。

步骤4:打开布局文件activity_smsreceiver.xml,删除默认的Text View,向该布局文件中拖入一个按钮,在界面编辑器中完成位置约束,设置该按钮的ID为register Button,宽度与父控件同宽,高度设置为根据内容拉伸。为按钮设置点击事件属性“android:onClick="register Receiver Listener"”,那么该按钮的点击事件将在对应的Java类中用方法“public void register Receiver Listener(View v){……}”实现,不需要再定义监听器类和绑定监听器。设置按钮中的文字颜色为白色,文字大小为20 sp,背景颜色采用在colors.xml文件中定义的常量“right”。

步骤5:在SMSReceiver Activity中定义需要用的常量和变量

注意:常量字符串SMS_ACTION的取值大小写敏感,这里有任何差异都将导致拦截短信失败,而且不易排查。

步骤6:实现步骤4的布局文件中定义的register Receiver Listener(View v)方法。用户点击界面上的Button就会调用该方法,并且将Button作为入参进行传递。因为该方法需要打开短信的监听功能,所以需要用户打开接收短信权限。为了增加应用程序的易用性,本实验中采用弹出对话框让用户选择是否打开权限。

步骤7:在步骤6中register Receiver()方法和unregister Receiver()方法会报错,可通过“Alt+Enter”键进行修复,按这两个键后会弹出图3.6所示的界面,选择“Create method register Receiver in SMSReceiver Activity”创建该方法。

图3.6 通过修复的方式定义check Permission()方法

步骤8:通过重载onRequestPermissionsResult()方法获取用户是否赋予接收短信权限对话框的结果,并将结果付给全局变量perm_flag,该值如果等于0则表示未授权但后面还会再提示,如果等于-1则表示不同意授权,并且不再提示,如果等于1则表示用户已授权。

步骤9:在右侧窗口中,右击代码的包路径“cn.edu.android.app08”,依次单击“New”|“New Java Class”,在弹出的图3.7所示的对话框中输入类名“SMSReceiver”,并使其继承自BroadcastReceiver。在该类中实现onReceive()方法,并加入解析短信的代码。

图3.7 新建广播消息接收者SMSReceiver类

步骤10:在Android Manifest.xml文件中的/application标签后增加usespermission android:name="android.permission.RECEIVE_SMS"/uses-permission,即增加使系统接收短信的权限。

步骤11:打开res/Values/styles.xml文件,增加该应用的背景色,采用drawable目录下定义的XML文件,使背景呈现多个图层堆叠显示效果。

步骤12:在drawable目录下新建window_background.xml文件,在该文件中加入以下内容。

步骤13:在drawable目录下新建statusbar_background.xml文件,该文件中设置渐变的色块是一个长方形,渐变的角度为45°,颜色变换的中心点在70%的位置。

步骤14:运行并测试App08。

知识拓展:按钮监听器

Android中按钮监听器的实现方式主要有以下5种。

(1)通过匿名内部类实现的监听方式:

(2)通过内部类实现的监听方式:

(3)多个控件使用一个监听器的方式:

(4)由类文件实现OnClick Listener接口的方式:

(5)布局文件使用onClick属性的方式注册事件,本实验中就采用该种方式进行注册。该注册方式首先需要在布局文件的控件下增加onClick属性,属性取值为方法名称,然后在布局文件对应的代码中添加该方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈