Android study --- 广播

广播接收者

  • 在Android系统运行时会产生很多事件,事件产生时,回想系统发送广播,只要向系统发送广播,系统就知道发生了相应的事件,从而执行相对应的代码。在系统中只要使用广播接受者,就可以接收广播

创建广播接受者

  • 1、定义Java类继承BroadcastReceiver
  • 2、在清单文件爱中定义receiver节点,定义属性,指定广播接受者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匹配时,系统会启动该广播接收者所在的进程,并把广播发给该广播接收者
  • 6、获取广播中的数据,并且重新封装数据,放入到广播中去
	//接收到广播时就会调用
@Override
public void onReceive(Context context, Intent intent) {
//添加IP线路
//在打电话广播中,会携带拨打的电话的号码,通过以下代码获取到
String number = getResultData();
if(number.startsWith("0")){
SharedPreferences sp = context.getSharedPreferences("ip", Context.MODE_PRIVATE);
String ipNumber = sp.getString("ipNumber", "");
//把IP线路号码添加至用户拨打号码的前面
number = ipNumber + number;
//把新的号码重新放入广播中
setResultData(number);
abortBroadcast();
}
}

短信防火墙

  • 系统发送短信广播时,是怎么把短信内容存入广播的,我们就只能怎么取出来

  • 如果短信过长,那么发送时会拆分成多条短信发送,那么短信广播中就会包含多条短信

  • 4.0之后,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效

  • 4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,

    那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程

      public class SmsReceiver extends BroadcastReceiver {
    
      @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);
    }
    // System.out.println(sms.getMessageBody());
    }
    }
    }
  • 清单文件设置

      <receiver android:name="com.itheima.smslanjie.SmsReceiver">
    //android:priority="1000"设置该广播的等级
    <intent-filter android:priority="1000">
    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
    </receiver>

广播的分类

无序广播
  • 所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到
有序广播
  • 所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序
上一篇:将DataTable格式化为json字符串返回


下一篇:java.lang.Boolean 类源码解析