安卓基础7:广播接收者


广播接收者(broadcastReceiver)


现实中接收广播需满足:1、收音机 2、电池 3、接收频道

Android内部相当于定义好了电台,就是定义好了一些时间(eg:打电话、发短信、电量低、sd卡状态、卸载安装、开机启动)我们开发者只需要注册这个事件就OK;

谷歌开发的三个方向:Javase(java基础)   java me(移动)  javaee(网站开发)

Java me难以开发移动的一些东西,因此谷歌将一些难以开发的东西单独拿出进行封装,方便我们编程;

 


Ip拨号器:


1、 定义一个广播接收者类继承broadcastReceiver(买了一个收音机)

2、 在清单文件中创建receiver标签(买了一个电池)

3、 在receiver标签中设置action节点对需要监听的事件,为(调到合适的频道)

android 广播接受发送 安卓广播接收者_基础

4、 配置权限:

android 广播接受发送 安卓广播接收者_广播_02

注意:这里配置清单的时候,先要确定监听之后跳转的位置,然后确定监听的事物


代码


描述:我们先在主界面中,设置ip电话前面要加的号码,然后编写捕捉到电话广播后的处理程序;


界面:


android 广播接受发送 安卓广播接收者_广播接收者_03

android 广播接受发送 安卓广播接收者_android_04


事件处理:


主界面:

android 广播接受发送 安卓广播接收者_基础_05


捕捉广播:

android 广播接受发送 安卓广播接收者_基础_06

这里的getResultData()获取的是当前广播所传来的数据


设置配置文件


android 广播接受发送 安卓广播接收者_android_07

注意:这里需要加打电话的权限


SdCard状态查看器


应用的生命周期基于的是进程,退出仅仅是退出任务栈;而广播的生命周期存在于进程中,一旦部署上去便一直存在。


代码:


描述:我们设置sdcard加载和卸载的广播监听,在监听到之后执行相应操作


事件处理


android 广播接受发送 安卓广播接收者_android 广播接受发送_08


设置配置文件


android 广播接受发送 安卓广播接收者_广播_09

注意:需要做一个额外的约束scheme


短信监听器:


不同阶段广播设计


2.3无广播安全设计

4.0后若要广播生效,需要第一次安装的时候有界面;

可以通过app的强行停止去关闭相应进程,从而阻止广播;

 

注意:

配置文件需要额外配置一个约束scheme

android 广播接受发送 安卓广播接收者_广播_10


代码


事件处理:


android 广播接受发送 安卓广播接收者_android_11

”pdus”是关键字,这里pdu是获取一条短信的内容,而“pdus“是获取许多短信的内容;


配置清单:


android 广播接受发送 安卓广播接收者_android_12

 


卸载安装事件:


注意: 广播不能直接开启界面,其由任务栈维护,因此为了开启必须加上栈的环境;


代码:


事件处理:


android 广播接受发送 安卓广播接收者_android 广播接受发送_13


配置清单:


android 广播接受发送 安卓广播接收者_android 广播接受发送_14

 


开机启动事件:


代码


描述:我们添加一个监听手机开机的事件,在手机开机之后自动调用我们的app,同时屏蔽返回键;


事物处理层:


主界面:

android 广播接受发送 安卓广播接收者_android_15

这里我们通过屏蔽onBackPressed方法中的super调用屏蔽返回键

 

启动监听广播

android 广播接受发送 安卓广播接收者_android 广播接受发送_16

配置清单:

android 广播接受发送 安卓广播接收者_android_17

 

Activity是由任务栈维护的,所以在广播中开启任务栈需要加上

intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent2);

不然会报错:

java.lang.RuntimeException:Unable to start receiver com.itheima.boot.BootReceiver:android.util.AndroidRuntimeException: Calling startActivity() from outside ofan Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is thisreally what you want?

注意:这里需要增加一个权限;

android 广播接受发送 安卓广播接收者_android_18


自定义广播:


无序广播和有序广播:


概念上的区别:


1、 无序广播:类似于新闻联播,准时开播,没接收到就收不到了;

特点:

a)      不可以被终止

b)     广播不可以被拦截

2、 有序广播:类似中央发红头文件,按照广播接收者的优先级,一级一级往下发

特点:

a)    最终接受者,不用再清单文件中配置;会在最后;收到广播

b)    在广播中途我可通过abortBroadcast()终止广播,但是最终接受者依然会收到广播;


代码上的区别:


有序广播:

1.     不对最后的结果负责,发了就发

2.     通过intent发送数据和接收数据

无序广播:

1.     需要对最后的结果负责,需要有一个回传的广播信息

2.     通过发送广播函数携带信息发送,通过context的getResult获取信息。同时每一级可通过setResult可对下一级信息进行修改;

 


无序广播代码:


广播发送者 


事务处理层:

android 广播接受发送 安卓广播接收者_android_19


广播接收者


事物处理层


android 广播接受发送 安卓广播接收者_android 广播接受发送_20


配置清单文件


android 广播接受发送 安卓广播接收者_android 广播接受发送_21


有序广播代码:


描述:我们做一个逐级分发大米广播


广播发送者:


发送事件


android 广播接受发送 安卓广播接收者_android_22

回传广播接收

android 广播接受发送 安卓广播接收者_android_23

注意:这里不需要配置清单文件,因为在广播发送的时候已经指定好了;


广播接收者


事件处理


省接收:

android 广播接受发送 安卓广播接收者_广播_24

市接收:

android 广播接受发送 安卓广播接收者_广播_25

乡接收

android 广播接受发送 安卓广播接收者_广播_26

村民接收:

android 广播接受发送 安卓广播接收者_基础_27


配置清单


android 广播接受发送 安卓广播接收者_android_28

这里通过在文件过滤器中加入属性priority进行优先级分配


特殊广播接收者:


操作特别频繁的广播事件 eg:频繁的锁屏和解锁;这些广播接收者在清单文件里注册是无效的;

对于这种广播时间,需要通过代码的方式去实现接收广播:

 


代码:


注册广播:


android 广播接受发送 安卓广播接收者_android 广播接受发送_29

这里就是在模拟注册文件的工程,需要注意的是在关闭app时,需要手动关闭注册的广播;


接收广播:


android 广播接受发送 安卓广播接收者_广播_30

谷歌用意:一旦这样的事件注册生效,若有很多应用定用该广播,则导致很多应用打开,内存消耗很大;

 


样式和主题:


Style:


android 广播接受发送 安卓广播接收者_基础_31


Theme:


android 广播接受发送 安卓广播接收者_android 广播接受发送_32


Style “vs” theme


共同点:定义的方式是一样的

不同点:作用范围不一样,样式作用在控件上,主题主要作用在application或者activity上;

注意:定义样式和主题时并不一定要在style下定义,在values下的.xml文件中都可以;

 


安卓下的国际化:


就是在res下创建不同国家的语言环境集;values-en….


对话框


普通对话框


android 广播接受发送 安卓广播接收者_基础_33

android 广播接受发送 安卓广播接收者_广播_34


单选对话框


android 广播接受发送 安卓广播接收者_广播接收者_35

android 广播接受发送 安卓广播接收者_android_36


多选对话框


android 广播接受发送 安卓广播接收者_android_37

android 广播接受发送 安卓广播接收者_android 广播接受发送_38

android 广播接受发送 安卓广播接收者_基础_39


进度条对话框


android 广播接受发送 安卓广播接收者_广播_40

android 广播接受发送 安卓广播接收者_基础_41

都可以在子线程更新UI


两种上下文的区别:


getApplicationContext:获取当前应用的上下文,一个应用里,可以有多个activity,getApplicationContext获取所有activity的上下文资源;其生命周期是整个应用;

this:表当前的activity的context资源;其生命周期是当前的界面;

注意:

这两个上下文仅仅在对话框中比较特殊,其他应用都差不多;因为在界面中需要通过将框架显示在某个界面上,若为getApplicationContext则导致编译器不知道如何选择显示界面;