【笨鸟先飞】android重新学习日记6---使用intent的组件(广播Broadcast)

启动程序,启动服务,发送广播。

Intent用于这3种情况,android四大基本组件,其中三个是使用intent在锁定目标和传递数据的。

contentProvider不使用Intent,使用URI

 

先说明一下区别,contentProvider是一定要传递数据的,而且数据传递的量还不少,特别是query这个情况,就是查询,这里面数据量很大,所以URI,仅是用来定位,定好位之后,有大量的数据交互,包括添加insert,删除delete,查找query,更新updata

 

启动程序,启动服务,发送广播,主要都是一个行为的传递,或许会带着一些数据,但是数据交互很少,没有你来我往的交互,Intent就是给你了,或许会带一些数据,甚至较多的数据,但绝对不指望你还返回一大堆数据。

 

Intent启动程序,启动服务是基本一致的,因为服务和程序很像,最大区别是界面。关于启动程序,上一章讲的很多了。

 

所以今天复习或者学习使用Intent的组件,就是学习broadcast

 

广播是一个使用很广泛,有一点不稳定的程序间通信手段,偶尔也会用来程序内部通信

 

不稳定是时间上的,发出的广播会比较快的被接收到,但是中间有一定时间差,所以如果是正对性特别强的程序间通信,会考虑反射等跨程序直接调用。另一方面,程序间通信对及时度要求并不苛刻,就像发短信,你发出短信,不要对面立刻受到,对面晚个23秒也没关系。所以广播非常实用。

 

广播由发送广播和接收广播组成。

发送广播:需要使用intent,需要放入action,这个广播核心参数基本都是

Intent.setaction(“自己取名字”)  

sendbroadcastintent

 

Action名字一般建议包名加上action在加上大写的内容介绍

简单点说就是模仿android给的标准action的写法

 

android.intent.action.MAIN   这个就是表示程序入口的动作,它是android的标准action,标准action有很多,这里不一一介绍了。只是作为一个示例。

 

 

接收广播:

1,创建接收器,并且重写onReceive方法,看到on开头的方法,就是我第3章讲的监听器和回调。这里就是在接到广播的时候会触发的方法,我们重写内容1

2,注册接收器,注册接收器的时候,需要添加IntentFilterIntentFilter直接创建一个,然后往里面添加action就可以,而且可以多次添加不同的action,这种情况下,添加的广播都会触发这个Receive。  注册接收器,就是将actionreceive方法绑定。也就是讲action和内容1绑定。当有哪些action被发出的时候,会引发内容1

3,注销接收器。注册的广播不会随着程序的关闭而消失,所以需要手动注销掉广播,根据之前的生命周期的分析,我们一般把注销接收器放在onDestory()这个生命周期结束的地方。

//步奏1

BroadcastReceiver Receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

内容1

}

}

//步奏2

final IntentFilter filter = new IntentFilter();

filter.addAction("自己取的名字");

registerReceiver(Receiver, filter);

 

//步奏3

unregisterReceiver(Receiver)

 

 

上面的发送与接收,基本就涵盖了广播的所有代码,或者说最常用的代码。有序广播和静态注册有兴趣可以了解一下。

 

实际使用广播基本就是上面这种方法,从代码看,在发送和接收时,是通过Intentaction参数来判断,并不是componentName。这说明广播如其名,是广而告之,广而收之。还说明对于同一个action可以由不同的程序来发送,还可以由不同的程序来接收。

 

广播的action的含义是一个动作,比如删掉所有短信,那么每个程序都可以发送这个广播,如果发了,那么短信就真的被删掉了。当然实际不是那么容易的,因为大多数广播都是自己取的名字,只有对方知道了名字才可以使用这个广播。

 

同样的接收广播也可以有很多,比如,关掉当前程序。如果真有这个广播,那么接收这个广播的程序,都会关闭掉自己,无论在前台还是在后台。

 

Intent的参数传递也是广播的一个组成部分,广播一般是通过action来告诉对方做什么,也就是对面识别action对上号了就会做什么,但是往往做事情的时候,需要一定的数据,这个数据一般不多,但是需要。

 

方案就是上一章提到的Bundle extra= new Bundle(); 

我们将extra放到intent里面随着广播发出去,接收到广播的呢,就可以从intent里面获取数据了,获取方式如下:

int a= intent.getIntExtra("数据的名字", -1);
String b= intent.getStringExtra("字符串的名字");

基本数据类型和数组都可以通过getXXXExtra方法获得。

 

在实际使用广播的时候,双方是会进行约定的,关于广播的一切信息对于双方是公开的,包括intentaction是什么,以及intent里面包含了哪些参数,这些参数的数据类型,都是要事情沟通好。再来实现程序间通信的。

广播应该是程序间通信最常见的方式了,也是程序间通信最简单的方式。

 

关于多个广播放在同一个receive里面,我们采用以下方法来进行区分,

if(action.equals("广播名字"){

内容1

}

更多时候作为一种良好的习惯,及时只接收一个广播,也可以进行这么一个判断,这样增加了代码的可读性。

 

因为接收广播的3个操作往往在3个不同的地方,我们直接看内容1的时候,就可以看到是哪个广播触发的内容1

 

其次,当后面增加IntentFilter,识别更多的广播时,修改起来也容易一些

 

良好的编程习惯可以有效的避免繁杂的小错误,以及代码的健壮性和扩展性。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值