BroadcastReceiver 广播接收者

本文详细介绍了Android中的广播机制,包括BroadcastReceiver的定义、注册方式、广播的分类(普通广播与有序广播)、广播的发送方法及如何接收广播。还提供了代码示例帮助理解广播接收者的动态注册过程。

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

三、BroadcastReceiver 广播接收者
系统的一些事件,比如来电,来短信,等等,会发广播;可监听这些广播,并进行一些处理;
Android3.2以后,为了安全起见,对于刚安装的应用,需要通过点击进入应用(界面,用户确认之后),接收者才能起作用;
以后即使没有启动其界面,也能接收到广播;
1、定义广播接收者
1)定义类继承BroadcastReceiver,重写onReceive方法
2)清单文件中声明,需要在其中配置指定接收广播的类型;
3)当接收到匹配广播之后就会执行onReceive方法;
4)有序广播中,如果要控制多个接收者之间的顺序,可在配置priority属性,系统默认为0,值越大,优先级越高;
5)BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册Receiver;

 <!-- 配置广播接收者,监听播出电话 -->
     <receiver android:name="com.itheima.ipdialer.CallReceiver" >
          <intent-filter>
               <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
           </intent-filter>
 </receiver>

2、广播的分类
1)普通广播:
普通广播不可中断,不能互相传递数据;
2)有序广播:
广播可中断,通过调用abortBroadcast()方法;
接收者之间可以传递数据;

3、广播接收者的注册方式
4大组件中,只有广播接收者是一个非常特殊的组件,其他3大组件都需要在清单文件中注册;
广播接收者,有2中注册方式:清单文件与代码方式,区别:
1)清单文件注册广播接收者,只要应用程序被部署到手机上,就立刻生效,不管进程是否处于运行状态;
2)代码方式,如果代码运行了,广播接收者才生效,如果代码运行结束,广播接收者,就失效;
这属于动态注册广播,临时用一下,用的时候,register,不用时unregister;

代码方式示例:
private class InnerReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String phone = getResultData();
            String address = AddressDao.queryAddress(getApplicationContext(), phone);
            showAddress(address);
        }
    }
    // 注册示例代码
    public void onCreate() {
        // == 服务启动时,注册广播接收者 ==
        innerReceiver = new InnerReceiver();
        // 指定意图过滤器
        IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
        this.registerReceiver(innerReceiver, filter);
    }
    // 销毁   
    public void onDestroy() {
        // == 服务停止时,移除广播接收者 ==
        this.unregisterReceiver(innerReceiver);
        innerReceiver = null;
        super.onDestroy();
    }

4、发送广播
1)发送普通广播
①、使用sendBroadcast()方法可发送普通广播;
②、通过Intent确定广播类型,可携带数据,所有接收者都可以接收到数据,数据不能被修改,不会中断;
接收者无序(试验测试,是按照安装顺序来接收的);
③、广播时,可设置接收者权限,仅当接收者含有权限才能接收;
④、接收者的也可设置发送方权限,只接受含有相应权限应用的广播;
发送者:
Intent intent = new Intent(“com.itheima.broadcast.TEST”); // 指定动作;接收者,需要配置 intent filter才能接受到此广播
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // 包含未启动的过的应用(也可以收到广播),默认为不包含
intent.putExtra(“data”, “这是来着广播发送者发来的贺电”); // 广播发送者intent中的数据,接收者,修改不了
sendBroadcast(intent, null); // 发送无序广播,异步获取数据,不可中断,接收者之间不可传数据

接收者:
public class AReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.println(“AReceiver: ” + intent.getStringExtra(“data”));
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值