安卓中的四大组件_BroadcastReceiver

本文详细介绍了Android系统中的外拨电话广播、sd卡卸载广播、开机自动启动广播、接收短信广播、安装和卸载广播等常用广播类型及其应用实例。包括如何注册和发送广播,以及广播接收者的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Android系统常见的广播.

    • 外拨电话(ip拨号器)

      拦截动作: android.intent.action.NEW_OUTGOING_CALL
      需要权限: android.permission.PROCESS_OUTGOING_CALLS
      清单文件中配置:
      <receiver android:name="com.ycy.commonBroadcastReceiver.receiver.IpCallerReceiver" >
          <intent-filter>
          <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
          </intent-filter>
      </receiver>
      代码中,广播接收者类继承BroadcastReceiver,并重写onReceive方法:
      public class IpCallerReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              String resultData = getResultData();
              setResultData(ipNum + resultData);
          }
      }
      
    • sd卡卸载

      拦截动作: android.intent.action.MEDIA_UNMOUNTED
      指定scheme: file
      
    • 开机自动启动, 权限: 3.0以上版本必须加权限, 以下的版本可以不加, 注意: 3.0以上的版本如果用户没有启动过程序, 是接收不到广播的.

      拦截动作: android.intent.action.BOOT_COMPLETED
      需要权限: android.permission.RECEIVE_BOOT_COMPLETED
      
    • 接收短信的广播(短信拦截器) 拦截动作:android.provider.Telephony.SMSRECEIVED 需要权限:android.permission.RECEIVESMS

      // 取出短信的内容
      Bundle bundle = intent.getExtras();
      // 获得系统接收到的短信
      Object[] objectArray = (Object[]) bundle.get("pdus");
      for (Object sms : objectArray) {
          byte[] smsBytes = (byte[]) sms;
      
          // 把byte数组转换成一个短信的对象
          SmsMessage smsMessage = SmsMessage.createFromPdu(smsBytes);
          // 取出号码
          String address = smsMessage.getOriginatingAddress();
      
          // 取出内容
          String body = smsMessage.getMessageBody();
      
          String text = "address: " + address + ", body: " + body;
          System.out.println(text);
      
          if("1386767".equals(address)) {
              // 把短信内容转发到自己的手机上.
              SmsManager smsManager = SmsManager.getDefault();
              smsManager.sendTextMessage(
                      "5556",  // 对方的号码
                      null,  // 短信中心的号码
                      text, // 短信内容
                      null, // 发送成功的回执
                      null); // 接收成功的回执
      
              // 终止广播
              abortBroadcast();
          }
      }
      
    • 安装和卸载广播

      拦截动作:
      android.intent.action.PACKAGE_ADDED
      android.intent.action.PACKAGE_REMOVED
      指定scheme: package
      
  • 注册广播接收者

    1. 定义类继承BroadcastReceiver
    2. 在清单文件声明, 接收的广播.
    3. 实现onReceive
  • 发送自定义广播.

    • 无序广播: 不可以被拦截

      • 如果拦截会报以下错误 BroadcastReceiver trying to return result during a non-ordered broadcast
    • 有序广播: 优先级高的会拦截优先级低的.

      • 优先级的取值范围是: 1000(高) ~ -1000(低)
      • 相同优先级下, 先声明的比后声明的先收到. Intent intent = new Intent("com.ycy.songwennuan"); sendOrderedBroadcast( intent, null, new LeiFengReceiver(), // 无论是否拦截这个有序广播, 最终此参数指定的广播接受者必须收到. null, 0, "10000块钱", null);
  • java代码注册广播接受者:

    • 特点: 优先级为0,并且要比清单文件为0的优先级的要高, 当前的广播接受者的生命周期的期限和activity是相关联的.

    • 注册

      IntentFilter filter = new IntentFilter();
      filter.addAction("com.ycy.help");
      
      leiFengReceiver = new LeiFengReceiver();
      // java代码注册广播接受者, 
      // 特点: 优先级要比清单文件为0的要高(因为他的优先级是0), 
      // 当前的广播接受者的生命周期的期限和activity是相关联的.
      registerReceiver(leiFengReceiver, filter);
      
    • 解注

      unregisterReceiver(leiFengReceiver);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值