- BroadcastReceive简介
BroadcastReceive也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
- 广播接收器的类型
(1)Normal broadcasts:默认广播
发送一个默认广播使用Content.sendBroadcast()方法,普通广播对于接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
(2)Ordered broadcasts:有序广播
发送一个有序广播使用Content.sendOrderedBroadcast()方法,有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接收者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
(3)Sticky Broadcast:粘性广播
当处理完之后的Intent,依然存在,直到你把它去掉。 - 广播接收器的创建步骤
构建Intent,使用sendBroadcast方法发出广播。
定义一个广播接收器,该广播接收器继承BroadcastReceive,并且覆盖onReceive()方法来响应事件
注册该广播接收器,我们可以在代码中注册,也可以在清单文件中注册。
自定义的广播接收器
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1(){
}
//接收
@Override
public void onReceive(Context context, Intent intent) {
String info=intent.getStringExtra("info");
Toast.makeText(context,info,Toast.LENGTH_SHORT).show();
}
}
发送一个普通的广播
public void sendNormalClick(View v){
Intent intent=new Intent("com.example.action.MY_BROADCAST");
intent.putExtra("info","姑娘约否");
this.sendBroadcast(intent);
}
注册文件中添加对应的action
效果图
- 注册广播接收器的两种方式
静态注册
静态注册是在AndroidManifest.xml文件中配置。
动态注册
动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播
如
MyReceiver receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(receiver,filter);
解除注册
unregisterReceiver(receiver);
有序广播的创建
先创建两个接收器
public class MyReceiver3 extends BroadcastReceiver {
public MyReceiver3(){
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle data= getResultExtras(false);
String info= data.getString("info");
Toast.makeText(context,"有序广播-1----"+info,Toast.LENGTH_SHORT).show();
}
}
public class MyReceiver4 extends BroadcastReceiver {
public MyReceiver4(){
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"有序广播-2",Toast.LENGTH_SHORT).show();
Bundle data=new Bundle();
data.putString("info","广播-2");
this.setResultExtras(data);
}
}
发送一个有序广播
public void sendOrderClick(View v){
Intent intent=new Intent("com.example.action.MY_BROADCAST2");
//参数:intent ,接收权限
this.sendOrderedBroadcast(intent,null);
}
清单文件中注册action
其中priority表示优先级,属性范围(-1000,1000),数值越大,优先级越高。
中断有序广播
this.abortBroadcast();
同级别接收先后是随机的,再到级别低的收到广播;如果先接收到的把广播截断了,同级别以外的接收者是无法收到该广播的。
在这个方法发来的广播中(代码注册方式中),收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。
粘性广播的创建
创建一个广播接收器
public class MyReceiver5 extends BroadcastReceiver {
public MyReceiver5(){
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收一个粘性的广播",Toast.LENGTH_SHORT).show();
}
}
发送一个粘性广播
public void sendStickyClick(View v){
Intent intent=new Intent("com.example.action.MY_BROADCAST3");
this.sendStickyBroadcast(intent);
}
粘性广播必须要权限
在清单文件中加入
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
新建一个Activity用来接收粘性广播(测试)
里面写两个方法
protected void onResume() {
IntentFilter filter=new IntentFilter("com.example.action.MY_BROADCAST3");
registerReceiver(receiver5,filter);
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver5);
}
启动activity按钮
public void openStickyClick(View v){
Intent intent=new Intent(this,Main2Activity.class);
startActivity(intent);
}
先发送一个粘性广播,然后启动Activity
检测网络状态的广播
public class MyReceiver7 extends BroadcastReceiver {
public MyReceiver7(){
}
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info=cm.getActiveNetworkInfo();
if (info!=null){
String name=info.getTypeName()+"";
Toast.makeText(context,name,Toast.LENGTH_SHORT).show();}
}
}
需要访问网络的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
注册文件
立即获取当前电量
在onResume方法里写就可以启动程序直接显示
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
Intent battertIntent= getApplicationContext().registerReceiver(null,intentFilter);
int curr=battertIntent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
int total=battertIntent.getIntExtra(BatteryManager.EXTRA_SCALE,1);
int percent=curr*100/total;
Toast.makeText(this,"当前电量为"+percent+"%",Toast.LENGTH_SHORT).show();
发送短信
关键权限
<uses-permission android:name="android.permission.SEND_SMS"/>
发送短信的方法
public void sendMassageClick(View v){
//获取短信管理器
SmsManager smsManager=SmsManager.getDefault();
String message="你好我是哈皮哦";
//拆分长短信
ArrayList<String> list=smsManager.divideMessage(message);
System.out.println("list size:"+list.size());
int size=list.size();
for(int i=0;i<size;i++){
//参数:收件人号码,信息中心,短信内容,信息中心的交互,信息中心的交互
smsManager.sendTextMessage("5556",null,list.get(i),null,null);
}
}
在虚拟机上测试效果如下
接收短信
自定义一个接收器
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
if(bundle!=null){
Object[] objs= (Object[]) bundle.get("pdus");
SmsMessage[] smsMessages=new SmsMessage[objs.length];
for(int i=0;i<objs.length;i++){
smsMessages[i]=SmsMessage.createFromPdu((byte[]) objs[i]);
//发送方的号码
String number=smsMessages[i].getDisplayOriginatingAddress();
//获取短信的内容
String content=smsMessages[i].getDisplayMessageBody();
Toast.makeText(context,number+"--"+content,Toast.LENGTH_SHORT).show();
}
abortBroadcast();//拦截短信,可以比对黑名单等等
}
}
}
权限设置
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
对应的action