广播接收者

广播接收者:BroadcastReceiver

概念

系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。 Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁

广播的分类

无序广播:sendBroadcast
  • 所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到
有序广播:sendOrderedBroadcast
  • 所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序

创建广播接收者

  1. 定义java类继承BroadcastReceiver
  2. 在清单文件中定义receiver节点,定义name属性,指定广播接收者java类的全类名
  3. 在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配,比如,如果要接受打电话广播,那么action的值必须指定为

    <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    
  4. 因为打电话广播中所包含的action,就是”android.intent.action.NEW_OUTGOING_CALL”,所以我们定义广播接收者时, action必须与其匹配,才能收到这条广播

  5. 即便广播接收者所在进程已经被关闭,当系统发出的广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,并把广播发给该广播接收者

示例

短信拦截
  1. 新建项目,新建一个BroadcastReceiver,在清单文件中进行注册,注意要设置优先级属性,要保证优先级高于短信应用,才可以实现拦截并且设定过滤内容
//添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<receiver android:name="com.smslanjie.SmsReceiver">
    <intent-filter android:priority="1000">
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

2.在新建的广播接收器中,重写onReceive方法,用于接收系统短信广播

@Override
public void onReceive(Context context, Intent intent) {
    //拿到短信的信息
    //短信内容封装在intent中
    Bundle bundle = intent.getExtras();
    //以pdus为键,取出一个object数组,数组中的每一个元素,都是一条短信
    Object[] objects = (Object[]) bundle.get("pdus");

    //拿到广播中的所有短信
    for (Object object : objects) {
        //通过pdu来构造短信
        SmsMessage sms = SmsMessage.createFromPdu((byte[])object);
        if(sms.getOriginatingAddress().equals("138438")){
            //阻止其他广播接收者收到这条广播
            abortBroadcast();
//              SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "你是个好人", null, null);
        }
        //getMessageBody方法是获得短信内容
//          System.out.println(sms.getMessageBody());

    }

}
监听sd卡状态

和上一个例子相差不大,都是要在清单文件中进行设置,sd卡的状态分为:可用、移除和不可用三种状态
在broadcast中进行判断就好了

 <receiver android:name="com.itheima.sdlistener.SDStatusReceiver">
     <intent-filter >
         <action android:name="android.intent.action.MEDIA_MOUNTED"/>
         <action android:name="android.intent.action.MEDIA_REMOVED"/>
         <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
         <data android:scheme="file"/>
     </intent-filter>
 </receiver>
接收开机广播

清单文件中设置权限和action

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

 <receiver android:name="com.itheima.lesuo.BootReceiver">
      <intent-filter >
          <action android:name="android.intent.action.BOOT_COMPLETED"/>
      </intent-filter>
  </receiver>

设置接收开机启动广播

public void onReceive(Context context, Intent intent) {
    // 启动Activity,实现开机自动启动
    Intent it = new Intent(context, MainActivity.class);
    //创建任务栈存放启动的Activity
    it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(it);
}
发送自定义广播
public void click(View v){
    //发送自定义广播
    Intent intent = new Intent();
    //广播中的action也是自定义的
    intent.setAction("com.itheima.zdy");
    sendBroadcast(intent);
}
接收自定义广播

接受自定义广播中,要在清单文件中配置action和发送自定义广播的action相同,这样才能成功接收

 <receiver android:name="com.itheima.receivezdy.ZDYReceiver">
     <intent-filter >
         <action android:name="com.itheima.zdy"/>
     </intent-filter>
 </receiver>
监听应用的安装、卸载、更新

原理:应用在安装卸载更新时,系统会发送广播,广播里会携带应用的包名

  • 清单文件定义广播接收者接收的类型,因为要监听应用的三个动作,所以需要接收三种广播
<receiver android:name="com.itheima.app.AppReceiver">
 <intent-filter >
      <action android:name="android.intent.action.PACKAGE_ADDED"/>
      <action android:name="android.intent.action.PACKAGE_REPLACED"/>
      <action android:name="android.intent.action.PACKAGE_REMOVED"/>
      <data android:scheme="package"/>
  </intent-filter>
</receiver>
  • 广播接收者的定义
public void onReceive(Context context, Intent intent) {
    //区分接收到的是哪种广播
    String action = intent.getAction();
    //获取广播中包含的应用包名
    Uri uri = intent.getData();
    if(action.equals("android.intent.action.PACKAGE_ADDED")){
        System.out.println(uri + "被安装了");
    }
    else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
        System.out.println(uri + "被更新了");
    }
    else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
        System.out.println(uri + "被卸载了");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值