*【广播通信】BroadcastReceiver

Broadcast广播
广泛运用在应用程序之间传输信息的机制
BroadcastReceiver广播接收者
对广播进行过滤接收并响应的一类组件,就是用来接收来自系统和应用中的广播

产生广播:
开机完成后系统会产生广播
网络状态改变时系统会产生广播
电池电量改变时,系统会产生广播

Android为何要这样设计?
大大减少开发工作量和开发周期
作为应用开发者只需要掌握BroadcastReceiver

使用方法:
发送:
把信息装入一个Intent对象(如Action,Category)
通过调用相应的方法将Intent对象以广播方式发送
sendBroadcast()
sendOrderBroadcast()
sendStickyBroadcast()

接收:
当Intent发送后,所有已经注册的BroadcastReceiver会检查注册时IntentFilter是否与发送的Intent相匹配,匹配成功就会调用BroadcastReceiver的onReceive()方法。
所以定义一个BroadcastReceiver时都需要实现onReceive()方法

注意:
BroadcastReceiver需要注册
静态注册
代码注册

and !!
BroadcastReceiver生命周期只有10秒左右
在BroadcastReceiver里不能做耗时操作
应该通过发送Intent给Service,由Service来完成
不能使用子线程

广播的种类:

普通广播 Normal broadcasts
-所有监听该广播的广播接受者都可以间听到该广播
特点:
同级别接收先后是随机的(无序)
级别低的后收到广播
接收器不能截断广播继续传播也不能处理广播
同级别动态注册高于静态注册

.

有序广播Oraered broadcasts
-按照接受者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000间,值越大优先级越高.可终止光比意图的继续传播,接收者可以篡改内容.
特点:
同级别接收顺序时随机
能截断广播的继续传播,高级别广播接收器收到该广播后,可以决定把该广播是否截断
接收器能截断广播的继续传播,也能处理广播
同级别动态注册高于静态注册

.

异步广播(滞留广播)
-不能将处理结果传给下一个接受者,无法终止广播

广播接收器如何接收广播:
(1)Intent发送出去以后,注册了的BroadcastReceiver会检查IntentFilter是否与Intent匹配
(2)匹配则调用BroadcastReceiver的onReceive()方法来对广播信息Intent做出处理

广播如何发送:
(1)把信息装入一个Intent对象(如Action、Category)
(2)调用相应方法(如sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast())将Intent对象以广播方式发送出去

发送广播:
Intent intent = new Intent()
intent.putExtra(“msg”,”这是普通广播”)
Intent.setAction(“BC_One”);//确保Intent的唯一性
sendBroadcast(intent) //发送广播
接收广播:
1.继承BroadcastReceiver,实现其方法onReceiver()
String s=intent.getStringExtra(“msg”);
System.out.println(“接收到消息”+s);
abortBroadcast();//截断广播的方法,普通广播无法截断
清单文件(静态注册):
< receiver android:name=”包名加类名”>
< intent-filter android:proprity=”100”> //设置广播优先级,值为-1000~1000
< action android:name=”包名.类名”/>
< /intent-filter>
< /receiver>

动态注册方法:
IntentFilter intentfilter=new IntentFilter(“Broadcast_one”);//设置过滤
MyBroadcastReceiver2 receiver2 = new MyBroadcastReceiver2();
registerReceiver(receiver2, intentFilter);

注意:
1)动态注册的BroadcastReceiver优先级要比静态注册的高
2)动态注册有个弊端:如果当前java的程序结束了,动态注册的接收者将不再能收到广播。所以类似于短信拦截的BroadcastReceiver不能用动态注册。

广播的用法一:
(1)在按钮的监听事件处理方法中创建Intent对象,用Intent对象的putExtra(“msg”,”这是一条普通广播”);向Intent对象中加入消息字符串,并用setAction(“BC_One”)指定广播名。
(2)用sendBroadcast(Intent)发送广播消息Intent对象
(3)编写java文件,实现BroadcastReceiver抽象类的onReceive()
(4)在AndroidManifest.xml文件中注册广播接收者,名字为setAction(“BC_One”)方法指定的广播名


@有序广播

@class BC1
abortBroadcast();//拦截广播继续传播
Bundle bundle=new Bundle();
bundle.putString("test", "广播处理的数据");
setResultExtras(bundle);

@class BC2
Bundle bundle=getResultExtras(true);
String s2=bundle.getString("test");
Log.i("TAG", "处理后的数据:"+s2);

@doClick()
case R.id.button2:
Intent intent2=new Intent();
intent2.putExtra("msg", "这是一条有序广播!");
intent2.setAction("BC_One");
sendOrderedBroadcast(intent2, null);//第二个参数:权限
break;

传递数据:Bundle VS Intent
@Bundle
存储:
Bundle bundle=new Bundle();
bundle.putString("代号1", "传递数据1");
setResultExtras(bundle);
读取:
String s1=bundle.getString("代号1");

@Intent
存储:
Intent intent2=new Intent();
intent2.putExtra("代号2", "传递数据2");
//省略准备传递的代码...

读取:
String s2=intent.getStringExtra("代号2");
@异步广播

private BC3 bc3;//全局变量

case R.id.button3://异步广播
Intent intent3=new Intent();
intent3.putExtra("msg", "这是一条异步广播!");
intent3.setAction("BC_Three");
sendStickyBroadcast(intent3);
//若先发消息后注册可以成功,则有异步效果。
IntentFilter intentFilter=new IntentFilter("BC_Three");
intentFilter.setPriority(100);
bc3=new BC3();
registerReceiver(bc3, intentFilter);
break;

//动态注册的必须销毁APP时解除注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(bc3);
}

<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses>
发送普通广播 sendBroadcast(intent);
发送有序广播 sendOrderedBroadcast(intent2,null); <intent,receiverPermission>
中断广播 abortBroadcast();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 组件之间可以通过广播来进行通信广播是一种发布-订阅模式,其中一个组件(发送者)可以发送一个广播消息,而其他组件(接收者)可以注册监听该广播消息,并在接收到广播消息时执行相应的操作。 要实现组件之间的广播通信,首先需要定义一个广播的发送者和接收者。发送者可以通过创建一个Intent对象,并指定一个特定的广播动作(Action)来发送广播消息。而接收者可以使用BroadcastReceiver类来注册对特定广播动作的监听,并在接收到广播消息时执行相应的操作。 在发送广播之前,需要先注册接收者。可以在代码中使用registerReceiver()方法动态注册接收者,也可以在AndroidManifest.xml文件中静态注册接收者。接收者可以通过IntentFilter来指定监听的广播动作,也可以通过setPriority()方法来设置优先级。 当发送者发送一个广播消息时,所有注册了对该广播动作监听的接收者都会接收到该消息。接收者可以在onReceive()方法中获取到广播消息,并根据需要执行相应的操作。 广播可以用于组件之间的信息传递和事件通知。例如,可以使用广播来传递数据给其他组件,或者在系统事件发生时通知其他组件执行相应的操作。由于广播是异步的,组件之间可以并行处理广播消息,提高系统的响应性能。 需要注意的是,由于广播是全局的,所以在使用广播通信时要考虑安全性和性能问题,避免滥用广播机制导致系统资源的浪费和信息泄露的风险。 总而言之,Android组件之间可以通过广播来进行通信,通过定义发送者和接收者,并指定特定的广播动作,实现组件之间的信息传递和事件通知。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值