BroadCastReceiver是Android程序的四大组件之一。
BroadCastReceiver实际是广播的接收器,可以对BroadCast(广播)进行过滤,接收,处理的一个类。
使用的方式如下:
广播发送:
将信息(要发送的信息,过滤用的信息。如:Action,Category)添加到一个Intent对象中,然后通过相应的方法将Intent对象作为广播发送出去。
如:
sendBroadcast();
sendOrderedBroadcast();
sendStickyBroadcast();
广播接收:
当Intent对象被发送以后,所有已经加载的BroadCastReceiver会检查加载时的IntentFilter是否与被发送的Intent相匹配,若匹配,会调用BroadCastReceiver的onReceive方法。
所以定义BroadCastReceiver时,要实现onReceive方法。
注:BroadCastReceiver的加载方式有动态加载和静态加载。
注:BroadCastReceiver的生命周期只有十秒左右,所以不要在BroadCastReceiver中做耗时操作。
建议通过Intent让Service做。
广播类型:
普通广播:所有监听该广播的BroadCastReceiver都能收到该广播。
有序广播:按照BroadCastReceiver的优先级顺序接收广播,优先级在intent-filter中的priority中定义,-1000到1000之间,值越大,优先级越高,可以终止广播的继续传播,接收方也可以修改广播内容。
异步广播:不能将处理结果传给下一个接收方,也无法终止。
总结:
普通广播的特点:
1. 同级别接收先后顺序是随机的(无序)。
2. 级别低的后收到广播。
3. 接收方不能截断广播的继续传播也不能处理广播。
4. 同级别动态注册高于静态注册。
有序广播特点:
1. 同级别接收顺序是随机的。
2. 能截断广播的继续传播,高级别的BroadCastReceiver收到该广播后,可以决定是否截断该广播。
3. BroadCastReceiver能截断广播的继续传播,也能处理广播。
4. 同级别动态注册高于静态注册。
静态加载例:
定义BroadCastReceiver:
public class BCR extends BroadCastReceiver
{
public void onReceive(Context con,Intent intent)
{
System.out.println(intent.getStringExtra(msg));
}
}
发送普通广播:
Intent inte=new Intent();
inte.setAction("GL_1"); //此处为设置过滤信息。
inte.putExtra("msg","内容");
sendBroadcast(inte);
静态加载:
//在记录文件中,application标签内。
<receiver android:name="此处省略">
<intent-filter android:priority="优先级-1000到1000">
<action android:name="GL_1"/>
</intent-filter>
</receiver>
动态加载例:
定义BroadCastReceiver:
public class BCR2 extends BroadCastReceiver
{
public void onReceive(Context con,Intent intent)
{
System.out.println(intent.getStringExtra(msg));
}
}
发送普通广播:
Intent inte=new Intent();
inte.setAction("GL_1"); //设置过滤信息
inte.putExtra("msg","内容");
sendBroadcast(inte);
动态加载:
//在Activity中。
IntentFilter intentfilter=new IntentFilter("GL_1");
//上为过滤
BCR2 bcr2=new BCR2();
registerReceiver(bcr2,intentfilter);
有序广播例:
//发送有序广播。
Intent inte2=new Intent();
inte2.putExtra("msg","有序广播");
inte2.setAction("GL_1");
sendOrderedBroadcast(inte2,null);
//以下为先接收到广播的BroadCastReceiver。
public class BCR extends BroadCastReceiver
{
public void onReceive(Context con,Intent intent1)
{
System.out.println(intent1.getStringExtra("msg"));
Bundle bun=new Bundle();
bun.putString("data","处理结果");
setResultExtras(bun); //将处理结果设置进去。
}
}
//以下为后接收到广播的BroadCastReceiver。
public class BCR2 extends BroadCastReceiver
{
public void onReceive(Context con,Intent intent2)
{
System.out.println(intent2.getStringExtra("msg"));
Bundle bun=new Bundle();
bun=getResultExtras(true); //是否要接收处理结果
String bunstr=bun.getString("data");
System.out.println(bunstr);
}
}