1、Broadcast(广播)
是一种广泛运用在应用程序之间传输信息的机制
2、BroadcastReceiver(广播接收者)
是对发出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。
3、用途
当开机完成后系统会产生一条广播;
当网络状态改变时系统会产生一条广播
当电池电量改变时,系统会产生一条广播
等等
android为什么要这样设计?
.大大减少开发的工作量和开发周期
.作为应用开发者,只需掌握BroadcastReceiver
使用方法:
发送:
.把信息装入一个Intent对象(如Action、Category)
.通过调用相应的方法将Intent对象以广播方式发送出去
sendBroadcast(); //发送普通的广播
sendOrderBroadcast(); //发送有序广播
sendStickyBroadcast(); //异步广播(粘滞性滞留广播)
接收:
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册的IntentFilter是否与发送的Intent相匹配, 若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都 需要实现onReceive()方法。
注意:BroadcastReceiver需要注册
.静态注册 (在.xml注册)
.代码注册
BroadcastReceiver生命周期只有十秒左右
在BroadcastReceiver里不能做一些比较耗时的操作
应该通过发送Intent给Service,由Service来完成
不能使用子线程
广播的种类:
普通广播(Normal broadcasts)
所有监听该广播的广播接收者都可以监听到该广播。
有序广播(Ordered broadcasts)
按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越
大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。
异步广播(粘滞性滞留广播)
不能将处理结果传给下一个接收者,无法终止广播。
普通广播的特点:
同级别接收先后是随机的
级别低的后收到广播
接受器不能截断广播的继续传播也不能处理广播
同级别动态注册高于静态注册
有序广播的特点:
同级别接收顺序是随机的
能截断广播的继续传播,高级别的广播接收器接收到该广播后,可以决定把该广播是否截断。
接收器能截断广播的继续传播,也能处理广播。
同级别动态注册高于静态注册
demo:
package com.example.mhy.broadcast;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
/**
*广播生命周期很短只有十几秒,不能做耗时操作,
* 当主线程被杀死之后它所创建的子线程也会随之消亡
* 不能开辟子线程
* 耗时操作交给Service来做
*/
private BC2 bc2;
private BC3 bc3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册广播
bc2 = new BC2();
//新建消息过滤器
IntentFilter intentFilter0 = new IntentFilter("BC1");
registerReceiver(bc2, intentFilter0);
}
public void doClick(View v) {
switch (v.getId()) {
case R.id.send1:
Intent intent = new Intent();
intent.putExtra("msg", "这是一条普通广播");
//设置消息的唯一标志(一般以类名命名)
intent.setAction("BC1");
sendBroadcast(intent);
break;
case R.id.send2:
Intent intent2 = new Intent();
intent2.putExtra("msg","这是一条有序广播");
intent2.setAction("BC1");
sendOrderedBroadcast(intent2,null);
break;
case R.id.send3:
//滞留广播不考虑广播的发送和接收顺序
Intent intent3 = new Intent();
intent3.putExtra("msg", "发送一条滞留广播");
intent3.setAction("BC3");
sendStickyBroadcast(intent3);//过时的使用方式
IntentFilter intentFilter = new IntentFilter("BC3");
bc3 = new BC3();
registerReceiver(bc3, intentFilter);
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//如果为动态注册广播接收器 则使用后一定要解除注册
unregisterReceiver(bc2);
}
}
package com.example.mhy.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
/**
* Created by mhy on 2016/5/7.
*/
public class BC1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra("msg");
System.out.println("receiver1收到消息:" + s);
// abortBroadcast();
// Bundle bundle = new Bundle();
// bundle.putString("test", "广播处理的数据");
// setResultExtras(bundle);
}
}
package com.example.mhy.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
/**
* Created by mhy on 2016/5/7.
*/
public class BC2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra("msg");
System.out.println("receiver2收到消息:" + s);
//有序广播可以截断广播也广播之间也可以传递数据
// abortBroadcast();
// Bundle bundle = getResultExtras(true);
// String s2 = bundle.getString("test");
// System.out.println("得到的处理结果是:" + s2);
}
}
package com.example.mhy.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* Created by mhy on 2016/5/7.
*/
public class BC3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到了异步广播!");
}
}