Android四大组件之一广播

本文详细介绍了Android中的广播机制,包括如何创建广播接收者、广播的启动条件、广播分类及其应用场景等。并提供了发送自定义广播及实现短信防火墙的具体代码示例。

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

广播接收者:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播。
一:创建广播接收者
1.定义一个Java类继承BroadcastReceiver

public class CallReceiver extends BroadcastReceiver {
    //接受到广播时就会调用
    @Override
    public void onReceive(Context context, Intent intent) {
    }
}

2.在AndroidManifest.xml文件中定义receiver节点,定义name属性,指定广播接收者Java类的全类名

<receiver android:name="com.lc.ip.CallReceiver"               <intent-filter >
  <action    android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>

3.在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配。下面给出几个常见的action名称。

//拨打电话广播
android:name="android.intent.action.NEW_OUTGOING_CALL"
//接收短信广播
android:name="android.provider.Telephony.SMS_RECEIVED"
//开机广播
android:name="android.intent.action.BOOT_COMPLETED"

值得注意的是监听一些广播的时候,需要一定的权限。不同的广播相应的权限也不同。
二.广播的启动
1.4.0之前,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效
2.4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程。
三.广播的分类
1.无序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到。
2.有序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序。
*优先级的定义:-1000~1000
* 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
* abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
四.发送自定义广播
发送的广播action可以自行命名,但是接收者清单文件中的配置必须和其完全相同。发送广播的时候可以设置一个广播最终接收者,不管该广播中途是否被拦截,它都会收到广播。
简例说明:

//发送广播代码
public void click(View v){
        //发送自定义广播
        Intent intent = new Intent();
        //广播的action自己定义
        intent.setAction("com.lzz.lc");
        sendBroadcast(intent);
/*resultRecevier:不需要在清单文件中配置,这个广播接受者只接受该条有序广播,并且是最后一个收到该广播,并且一定能够收到该广播 即便该广播被拦截
        sendOrderedBroadcast(intent, null, new MyRecevier(), null, 0, "广播内容", null);
    }*/
    //上述代码中的MyRecevier()是自己定义的类,作为最终接收者,他同样继承于BroadcastReceiver。
      }
//接收广播代码
public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        String text = getResultData();
        System.out.println("一级收到文件"+text);
        //更改广播当中的内容,发送给比本身底优先级的广播接收者
        setResultData("我是第一,你是第二");
    }

短信防火墙代码实例

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context arg0, Intent intent) {
        // TODO Auto-generated method stub
        //拿到短信的內容,短信內容封裝在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("123456789")){
            //拦截该短信
                abortBroadcast();
                //回复给拦截短信的人信息
                SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "自动回复消息", null, null);
            }
        }
    }

}
//AndroidManifest.xml中配置
 <receiver android:name="com.example.message_fire">
    <intent-filter android:priority="1000">
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值