安卓学习日记——BroadcastReceiver

  • 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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值