北京千锋互联科技有限公司版权所有安卓开发组件BroadcastReceiver的应用一、什么是BroadcastReceiverBroadcastReceiver是安卓中的四大组件之一。为了方便于进行系统级别的消息通知,Android引入了一套类似的广播消息机制。当一个地方发送广播的时候,只要收听这个广播的广播接收都可以接收到这个广播。就像你打开收音机,只要你调到和中央一套的频率一致,大家都可以收听到节目。BroadcastReceiver就相当于收音机,而其他发送广播的地方就相当于广播电台。二、Android中广播分类Android中广播主要分为2类:标准广播和有序广播1、标准广播:标准广播(Normalbroadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。2、有序广播(Orderedbroadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了,甚至前面的广播可以修改广播内容再传递给下一个广播。北京千锋互联科技有限公司版权所有三、如何使用BroadcastReceiver1、定义一个类来继承系统提供的BroadcastReceiver类。然后覆写其中的方法:@OverridepublicvoidonReceive(Contextcontext,Intentintent){//TODOAuto-generatedmethodstub}该方法内部写接收到广播之后的逻辑处理代码。注意:1、此方法是在UI线程中执行的,所以不能执行耗时操作。如果需要执行耗时操作,则可以启动子线程来执行。2、数据都封装在intent对象中,可以从此对象中取出需要的数据2、由于BroadcastReceiver是四大组件之一,所以需要在AndroidManifest文件中注册BroadcastReceiver(静态注册)。receiverandroid:name=.IncomingSMSReceiver//自定义广播接受者intent-filteractionandroid:name=android.provider.Telephony.SMS_RECEIVED//intent-filter/receiver注意:1、广播接收者的类名建议使用全名(包名.类名)2、意图过滤器中action是指的当前action能接受的广播类型。3、可以注册的时候给意图过滤器添加属性android:priority=100来说明该广播的优先级。当接受有序广播时,优先级越高越先收到广播。3、BroadcastReceiver是四大组件中唯一支持使用java代码进行注册的组件(动态注册),所以第二步中的在AndroidManifest文件中的注册也可以使用java代码注册来替换。publicclassMainActivityextendsActivity{privateIntentFilterintentFilter;privateMyReceivermyReceiver;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建意图过滤器对象intentFilter=newIntentFilter();//给创建的意图过滤器对象指定action动作,来指明将来的广播接受者接收广播的类型intentFilter.addAction(com.qianfeng.aaa);//创建广播接收对象myReceiver=newMyReceiver();//使用代码动态注册广播接收。参数一:广播接受者参数二:意图过滤器registerReceiver(myReceiver,intentFilter);北京千锋互联科技有限公司版权所有}@OverrideprotectedvoidonDestroy(){super.onDestroy();//当Activity销毁的时候,取消广播接收的注册。unregisterReceiver(myReceiver);}}注意:1、静态注册的广播接收者app一旦安装在系统,则可以接收到指定的广播。不管这个app有没有启动。2、动态注册的广播接收者只有在注册完成后才能接收到广播,当注册他的组件销毁的时候,广播接收者也应该解除注册。四、发送广播广播的发送和接收是跨进程的,一个app发送的广播,其他的app只要权限和action匹配都可以接收到该广播4.1发送标准广播//创建意图对象,并指明action,那么意图过滤器与这个action匹配的广播接受者会//接收到这个广播Intentintent=newIntent(com.qianfeng.MY_BROADCAST);//发送出去广播sendBroadcast(intent);注:发送广播的方法都是上下文对象中的方法。4.2发送有序广播Intentintent=newIntent(com.qianfeng.MY_BROADCAST);//发送有序广播。参数一:意图对象参数二:权限。是否需要接受者需要选取才可//以收到广播sendOrderedBroadcast(intent,null);或者://由于发送有序广播的时候,中间会有可能被拦截掉,参数三则指定了一个这个广播//的最终接受者,也就说即使中间有人拦截了广播,则参数三指定的接//受者也会最终接收到这个广播。//其余的参数给null或0即可sendOrderedBroadcast(it,null,receiver,null,0,null,null);北京千锋互联科技有限公司版权所有注意:1、发送有序广播的时候,先接到广播的可以通过下面的方法来取消广播,导致后面的优先级低的广播接收者收不到广播。abortBroadcast();//放弃当前的广播,则优先级低的无法收到当前广播2、如果优先级高的广播接收者想给优先级低的广播接收者传递数据可以通过下面的方法:setResult()setResultData()setResultCode()setResultExtra()五、广播接收案例(接收一些系统广播)系统在合适的时间发送广播,我们的app通过接收这些广播可以实现一些比较实用的功能。如:系统启动完成、用户外拨电话、短信来到等等,系统都会发出相应的广播。ACTION_TIME_CHANGED:系统时间被改变;ACTION_DATE_CHANGED:系统日期被改变;ACTION_TIMEZONE_CHANGED:系统时区被改变;ACTION_BOOT_COMPLETED:系统启动完成;ACTION_BATTERY_CHANGED:电池电量改变;ACTION_SHUTDOWN:系统被关闭;Action_BATTRY_LOW:电池电量低;5.1软件自启动通过监听系统启动完成这个广播,可以实现软件的自启动的功能。1、定义广播接收者。注册广播接收者的意图过滤器添加action为:ACTION_BOOT_COMPLETED2、添加权限:uses-permissionandroid:name=android.permission.RECEIVE_BOOT_COMPLETED/3、在广播接收者的OnReceive()方法中来启动相应的组件,来达到软件自启动的目的。5.2拦截外拨电话5.3短信拦截1、注册广播接收者receiver北京千锋互联科技有限公司版权所有android:name=com.example.day17_01_broadcast_sms.MyBroadacastintent-filterandroid:priority=1000actionndroid:name=android.provider.Telephony.SMS_RECEIVED//intent-filter/receiver2、读写短信的权限:uses-permissionandroid:name=android.permission.RECEIVE_SMS/uses-permissionandroid:name=android.permission.SEND_SMS/3、处理接收到的短信:5.4网络、Wifi状态的访问Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化。1、注册:意图过滤器的actionactionandroid:name=android.net.conn.CONNECTIVITY_CHANGE/2、权限:uses-permissionandroid:name=android.permission.ACCESS_NETWORK_STATE/3、代码:北京千锋互联科技有限公司版权所有系统的BroadcastAction:android.intent.action.BATTERY_CHANGED充电状态,或者电池的电量发生变化android.intent.action.BOOT_COMPLETED在系统启动后,这个动作被广播一次(只有一次)android.intent.action.CFF语音电话的呼叫转移状态已经改变android.intent.action.CONFIGURATION_CHANGED设备的配置信息已经改变,参见Resources.Configurationandroid.intent.action.DATA_ACTIVITY电话的数据活动(dataactivity)状态(即收发数据的状态)已经改变android.intent.action.DATA_STATE电话的数据连接状态已经改变android.intent.action.DATE_CHANGED日期被改变android.server.checkin.FOTA_CANCEL取消所有被挂起的(pending)更新下载北京千锋互联科技有限公司版权所有android.server.checkin.FOTA_INSTALL更新已经被确认,马上就要开始安装android.server.checkin.FOTA_READY更新已经被下载,可以开始安装android.server.checkin.FOTA_RESTART恢复已经停止的更新下载android.server.checkin.FOTA_UPDATE通过OTA下载并安装操作系统更新android.intent.action.MEDIABUTTON用户按下了MediaButtonandroid.intent.action.MEDIA_BAD_REMOVAL扩展介质(扩展卡)已经从SD卡插槽拔出,但是挂载点(mountpoint)还没解除(unmount)android.intent.action.MEDIA_EJECT用户想要移除扩展介质(拔掉扩展卡)android.intent.action.MEDIA_MOUNTED扩展介质被插入,而且已经被挂载andro