android中BroadCastReceiver使用(广播的接受和发送)
来源:互联网 发布:淘宝助理5导入csv 编辑:程序博客网 时间:2024/04/30 01:38
一.BroadCastReceiver 简介
1.广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此Intent 的多个广播接收者所接收。
2.广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;
3.生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。
每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(ApplicationNo Response) 的对话框 。
4.怎么用好 BroadcastReceiver ?
如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 。如一个应用程序通知其他应用程序某些数据已经下载完毕。BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。
二.BroadCastReceiver 代码的实现
用接收短信举例:
第一种方式 :在AndroidManifest.xml中注册广播,则全局接受,即在任何的Activity中运行时,如果收到短信都会调用改广播
1.1新建一个SmsReceiver.java,当收到短信时调用改广播
packagecom.yuqiaotech.sms;
importandroid.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public classSmsReceiver extends BroadcastReceiver{
public static final int NOTIFICATION_ID= 10001;
@Override
publicvoidonReceive(Context context, Intent intent) {
showTost(context,intent);
}
/*
* 使用toast显示短消息
*/
privatevoidshowTost(Context context, Intent intent) {
String strRes = "android.provider.Telephony.SMS_RECEIVED";
if (intent.getAction().equals(strRes)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle !=null){
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (inti = 0; i < pdus.length;i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
sb.append("您收到了来自:【");
sb.append(currMsg.getDisplayOriginatingAddress());
sb.append("】\n的信息,内容:");
sb.append(currMsg.getDisplayMessageBody());
}
Toast toast = Toast.makeText(context, "收到了短消息: " + sb.toString(),Toast.LENGTH_LONG);
toast.show();
}
}
}
}
1.2在AndroidManifest.xml中注册广播
<receiverandroid:name=".SmsReceiver" android:enabled="true">
<intent-filter>
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
第二种方式 :在代码中注册广播,则局部接受,即只有在注册的activity运行时,如果收到短信才会调用该广播
2.1随便新建一个activity,smsTest.java,在onCreate()中添加代码:
//注册新的短信接收
String SMS_RECEIED="android.provider.Telephony.SMS_RECEIVED ";
IntentFilter filter = new IntentFilter(SMS_RECEIVED);
registerReceiver(newSmsReceiver(), filter);
广播类型及广播的收发
广播类型
普通广播 (Normal broadcasts)
发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。
异步广播 , 当处理完之后的Intent ,依然存在,这时候registerReceiver(BroadcastReceiver, IntentFilter) 还能收到他的值,直到你把它去掉 , 不能将处理结果传给下一个接收者 , 无法终止广播 .
有序广播 (Ordered broadcasts)
按照接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,-1000 到
1000 之间 , 值越大 , 优先级越高 . 可以终止广播意图的继续传播 . 接收者可以篡改内容 .
广播的收发
该组件接收被广播的 intent,Context 可以通过 sendBroadcast() 和 sendOrderedBroadcast()
方法实现广播的发送 。首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息 ( 如 Action 、 Category) 装入一个 Intent 对象,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent对象以广播方式发送出去。
使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法
普通广播的发送和接收:
sendBroadcast(intent);
Intent intent = new Intent( "cn.lenovo.yangguangf " );
sendBroadcast(intent);
priority :这个是 AndroidManifest.xml 中 intent-filter 的参数。
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = "cn.lenovo.yangguangfu" />
</ intent-filter >
</ receiver >
有序广播的发送和接收:
sendOrderedBroadcast(intent, receiverPermission);
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData,initialExtras)意图,广播,所有匹配的这一意图将接收机接收广播。
receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。 resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。
调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。
initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2;
initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;
initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;
1, 该广播的级别有级别之分,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;
2, 同级别接收是先后是随机的,再到级别低的收到广播;
3, 同级别接收是先后是随机的,如果先接收到的把广播截断了,同级别的例外的接收者是无法收到该广播的。(abortBroadcast() )
4 ,能截断广播的继续传播,高级别的广播收到该广播后,可以决定把该钟广播是否截断掉。
5 ,实验现象,在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。
异步广播的发送和接收:
sendStickyBroadcast(intent);
当处理完之后的Intent ,依然存在,直到你把它去掉。发这个广播需要权限<uses-permissionandroid:name="android.permission.BROADCAST_STICKY" />去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml同样要加上面的权限;
sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData,initialExtras)
这个方法具有有序广播的特性也有异步广播的特性;
发送这个广播要: <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 这个权限。才能使用这个方法。如果您并不拥有该权限,将抛出 SecurityException 的。
实验现象( sendStickyOrderedBroadcast ()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。
广播注册与注销
代码中注册广播:
注册广播方法一: registerReceiver(BroadcastReceiverreceiver, IntentFilter filter) ,第一个参数是我们要处理广播的 BroadcastReceiver (广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器。
注册广播方法二: registerReceiver(receiver,filter, broadcastPermission, scheduler) ,第一个参数是BroadcastReceiver (广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器;第三个参数是广播权限;第四个参数是 Hander ;
注意:权限重复现象,如果功能清单文件里注册了权限,在该方法再注册,则 receiver 无法收到广播,如果 功能清单文件里没有注册了权限,该方法注册也无法收到。当该方法没有注册权限,功能清单里注册的时候, receiver 能收到广播。
系统中注册广播:(在 AndroidManifest.xml 中 )
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "900" >
< action android:name = "cn.lenovo.yangguangfu" />
</ intent-filter >
</ receiver >
有时候还要根据发送广播是否指定权限,来决定是否要权限;
广播注销
// 代码中注销广播
unregisterReceiver(mBatteryInfoReceiver);
- android中BroadCastReceiver使用(广播的接受和发送)
- Android的Service与BroadcastReceiver之四 BroadcastReceiver 简介、开发与配置;发送广播、有序广播;使用BroadcastReceiver接受系统广播
- Android中 广播发送 和 接受 的简单示例
- Android广播的发送和接受
- Android中广播BroadCastReceiver使用
- android 随手记 广播的发送和接受
- android 随手记 广播的发送和接受
- Android中broadcastreceiver发送广播信息
- 接受和发送广播
- 接受和发送广播
- Android-广播BroadcastReceiver-自定义广播接受者和发送者
- 安卓BroadcastReceiver组件使用系列2:给多个广播接收者发送广播和有序广播的使用
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- Android中短信的接受广播和短信的解析
- msp430f1232最小系统以及调试过程。
- Linux 解压缩命令
- 利用libvirt管理KVM虚拟机
- 两个有意思的计算机相关的智力题
- 关于青春
- android中BroadCastReceiver使用(广播的接受和发送)
- android json解析及简单例子
- 嵌套优化版括号匹配检查
- c++返回table给lua
- 山区行
- OPNET学习笔记之ethcoax_net-----mac
- Android 基站定位源代码
- 第一门编程语言选谁?
- 雁过也,月满西楼