Android四大组件之一广播
2016-03-06 14:21
441 查看
广播接收者:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播。
一:创建广播接收者
1.定义一个Java类继承BroadcastReceiver
2.在AndroidManifest.xml文件中定义receiver节点,定义name属性,指定广播接收者Java类的全类名
3.在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配。下面给出几个常见的action名称。
值得注意的是监听一些广播的时候,需要一定的权限。不同的广播相应的权限也不同。
二.广播的启动
1.4.0之前,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效
2.4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程。
三.广播的分类
1.无序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到。
2.有序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序。
*优先级的定义:-1000~1000
* 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
* abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
四.发送自定义广播
发送的广播action可以自行命名,但是接收者清单文件中的配置必须和其完全相同。发送广播的时候可以设置一个广播最终接收者,不管该广播中途是否被拦截,它都会收到广播。
简例说明:
短信防火墙代码实例
一:创建广播接收者
1.定义一个Java类继承BroadcastReceiver
public class CallReceiver extends BroadcastReceiver { //接受到广播时就会调用 @Override public void onReceive(Context context, Intent intent) { } }
2.在AndroidManifest.xml文件中定义receiver节点,定义name属性,指定广播接收者Java类的全类名
<receiver android:name="com.lc.ip.CallReceiver" <intent-filter > <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver>
3.在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配。下面给出几个常见的action名称。
//拨打电话广播 android:name="android.intent.action.NEW_OUTGOING_CALL" //接收短信广播 android:name="android.provider.Telephony.SMS_RECEIVED" //开机广播 android:name="android.intent.action.BOOT_COMPLETED"
值得注意的是监听一些广播的时候,需要一定的权限。不同的广播相应的权限也不同。
二.广播的启动
1.4.0之前,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效
2.4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程。
三.广播的分类
1.无序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到。
2.有序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序。
*优先级的定义:-1000~1000
* 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
* abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
四.发送自定义广播
发送的广播action可以自行命名,但是接收者清单文件中的配置必须和其完全相同。发送广播的时候可以设置一个广播最终接收者,不管该广播中途是否被拦截,它都会收到广播。
简例说明:
//发送广播代码 public void click(View v){ //发送自定义广播 Intent intent = new Intent(); //广播的action自己定义 intent.setAction("com.lzz.lc"); sendBroadcast(intent); /*resultRecevier:不需要在清单文件中配置,这个广播接受者只接受该条有序广播,并且是最后一个收到该广播,并且一定能够收到该广播 即便该广播被拦截 sendOrderedBroadcast(intent, null, new MyRecevier(), null, 0, "广播内容", null); }*/ //上述代码中的MyRecevier()是自己定义的类,作为最终接收者,他同样继承于BroadcastReceiver。 } //接收广播代码 public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String text = getResultData(); System.out.println("一级收到文件"+text); //更改广播当中的内容,发送给比本身底优先级的广播接收者 setResultData("我是第一,你是第二"); }
短信防火墙代码实例
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent intent) { // TODO Auto-generated method stub //拿到短信的內容,短信內容封裝在intent 中 Bundle bundle = intent.getExtras(); //以pdus位鍵,取出一个object数组,数组中的每一个元素都是一条短信 Object[] objects = (Object[]) bundle.get("pdus"); //拿到广播中的所有短信 for(Object object : objects){ //通过pdu来构建短信 SmsMessage sms = SmsMessage.createFromPdu((byte[]) object); if(sms.getOriginatingAddress().equals("123456789")){ //拦截该短信 abortBroadcast(); //回复给拦截短信的人信息 SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "自动回复消息", null, null); } } } } //AndroidManifest.xml中配置 <receiver android:name="com.example.message_fire"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories