安卓广播Broadcast学习

上一篇 / 下一篇  2016-08-22 15:57:43 / 个人分类:安卓开发


Broadcast:当有外部事件比如:低电量,有电话短信接入,有wifi信号出来可用时等,这些情况发生时,你希望你的app能够接收到这些事件来临的消息,并且要做出一些对应的措施的时候,广播消息就应运而生了。BC就是帮助你的app去获取并且处理获取消息之后的app要做的具体操作的,

Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

安卓系统中就广播的是操作系统中发生的各式各样的事件:手机没电了,接到短消息,接到电话,拍摄照片事件等等,一旦发生了这些事件就会向所有的广播接收器广播这些事件,至于广播接收器对象怎么搞,就是广播接收器自己的p 事儿~

NOTE:广播发送方不关心接收方是否收到并如何处理广播,是否接收及接收后的处理都是由接收方自己处理,所以BR---------BroadcastReceiver就是给接收方如何处理收到的广播消息来使用的

BR的注册方式有两种:
一个静态注册:直接在mainfst文件中注册: 不好的地方是,你的app即便已经关闭了,只要一收到广播依然做对应的操作,这个不好,会对系统的电量,流量造成一定消耗
<receiver android:name="SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>



一个动态注册BR的代码:好处就是app关闭了就不接受广播了,你安卓系统发啥广播都与我木关系了~ 就是要有收拾,注册了就要记得销毁,不然就crash你!

public void onClick(View v){
//生成一个BR对象
smsReceiver =new SMSReceiver();
//生成一个IntentFilter对象
IntentFilter filter=new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);  ---SMS_ACTION是你自己写的常量
//注册
TestActivity.this.registerReceiver(smsReceiver,filter);


TestBC2Activity.this.unregisterReceiver(smsReceiver);

}


比如说你要写个自己的app去监控系统电量,就只需要定义自己的广播接收器即可:继承自BroadcastReceiver,然后去接收系统的电量变化广播,接收到了做对应的处理,比如打印,比如做个表,比如绘图,就在你的onrecevie函数里面写代码就可以了,

关于安卓的广播,实际安卓系统已经给定义好了,也就是安卓fr层已经自定义了他的广播,如:低电量,连上充电器,等等
那么如何看fr层这些东西都对呢?
找,写一些使用这些系统广播的app,来进行测试,测试是否能收到系统发出的广播,那就需要找知道安卓系统本身都会发送那些广播事件?----即安卓内置的Broadcast Actions:
ACTION_CAMERA_BUTTON  照相按钮被按下  ---车载无意义
ACTION_BATTERY_LOW   低电量
ACTION_BATTERY_CHANGED 电量变化---以前用的检测电池的那个就是接收这个bc去做的ui处理,车载意义感觉可能不太大
ACTION_DATE_CHANGED   日期改变---这个有意义,用日历之类的软件去出发,
ACTION_POWER_CONNECTED  充电
ACTION_REBOOT  设备重启 
ACTION_SCREEN_ON  亮屏
ACTION_SMS_RECEIVED 接收到sms

/*.........*/文本注释




原理就这么简单~
通过adb命令方式给某个特定应用发送广播,前提是这个特定应用已经定义了响应的br,命令格式如下:
adb shell am broadcast 后面的参数有:

[-a <ACTION>]
[-d <DATA_URI>]
[-t <MIME_TYPE>] 
[-c <CATEGORY> [-c <CATEGORY>] ...] 
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] 
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] 
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] 
[-n <COMPONENT>]
[-f <FLAGS>] [<URI>]



例如:

adb shell am broadcast -a com.Android.test --es test_string "this is test string" --eitest_int100--ez test_boolean true


说明:蓝色为key,红色为value,分别为String类型,int类型,boolean类型

TAG:

 

评分:0

我来说两句

Open Toolbar