启动程序,启动服务,发送广播。
Intent用于这3种情况,android四大基本组件,其中三个是使用intent在锁定目标和传递数据的。
contentProvider不使用Intent,使用URI。
先说明一下区别,contentProvider是一定要传递数据的,而且数据传递的量还不少,特别是query这个情况,就是查询,这里面数据量很大,所以URI,仅是用来定位,定好位之后,有大量的数据交互,包括添加insert,删除delete,查找query,更新updata。
启动程序,启动服务,发送广播,主要都是一个行为的传递,或许会带着一些数据,但是数据交互很少,没有你来我往的交互,Intent就是给你了,或许会带一些数据,甚至较多的数据,但绝对不指望你还返回一大堆数据。
Intent启动程序,启动服务是基本一致的,因为服务和程序很像,最大区别是界面。关于启动程序,上一章讲的很多了。
所以今天复习或者学习使用Intent的组件,就是学习broadcast。
广播是一个使用很广泛,有一点不稳定的程序间通信手段,偶尔也会用来程序内部通信
不稳定是时间上的,发出的广播会比较快的被接收到,但是中间有一定时间差,所以如果是正对性特别强的程序间通信,会考虑反射等跨程序直接调用。另一方面,程序间通信对及时度要求并不苛刻,就像发短信,你发出短信,不要对面立刻受到,对面晚个2、3秒也没关系。所以广播非常实用。
广播由发送广播和接收广播组成。
发送广播:需要使用intent,需要放入action,这个广播核心参数基本都是
Intent.setaction(“自己取名字”)
sendbroadcast(intent)
Action名字一般建议包名加上action在加上大写的内容介绍
简单点说就是模仿android给的标准action的写法
android.intent.action.MAIN 这个就是表示程序入口的动作,它是android的标准action,标准action有很多,这里不一一介绍了。只是作为一个示例。
接收广播:
1,创建接收器,并且重写onReceive方法,看到on开头的方法,就是我第3章讲的监听器和回调。这里就是在接到广播的时候会触发的方法,我们重写内容1,
2,注册接收器,注册接收器的时候,需要添加IntentFilter,IntentFilter直接创建一个,然后往里面添加action就可以,而且可以多次添加不同的action,这种情况下,添加的广播都会触发这个Receive。 注册接收器,就是将action和receive方法绑定。也就是讲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);
上面的发送与接收,基本就涵盖了广播的所有代码,或者说最常用的代码。有序广播和静态注册有兴趣可以了解一下。
实际使用广播基本就是上面这种方法,从代码看,在发送和接收时,是通过Intent的action参数来判断,并不是componentName。这说明广播如其名,是广而告之,广而收之。还说明对于同一个action可以由不同的程序来发送,还可以由不同的程序来接收。
广播的action的含义是一个动作,比如删掉所有短信,那么每个程序都可以发送这个广播,如果发了,那么短信就真的被删掉了。当然实际不是那么容易的,因为大多数广播都是自己取的名字,只有对方知道了名字才可以使用这个广播。
同样的接收广播也可以有很多,比如,关掉当前程序。如果真有这个广播,那么接收这个广播的程序,都会关闭掉自己,无论在前台还是在后台。
Intent的参数传递也是广播的一个组成部分,广播一般是通过action来告诉对方做什么,也就是对面识别action对上号了就会做什么,但是往往做事情的时候,需要一定的数据,这个数据一般不多,但是需要。
方案就是上一章提到的Bundle extra= new Bundle();
我们将extra放到intent里面随着广播发出去,接收到广播的呢,就可以从intent里面获取数据了,获取方式如下:
int a= intent.getIntExtra("数据的名字", -1);
String b= intent.getStringExtra("字符串的名字");
基本数据类型和数组都可以通过getXXXExtra方法获得。
在实际使用广播的时候,双方是会进行约定的,关于广播的一切信息对于双方是公开的,包括intent的action是什么,以及intent里面包含了哪些参数,这些参数的数据类型,都是要事情沟通好。再来实现程序间通信的。
广播应该是程序间通信最常见的方式了,也是程序间通信最简单的方式。
关于多个广播放在同一个receive里面,我们采用以下方法来进行区分,
if(action.equals("广播名字"){
内容1
}
更多时候作为一种良好的习惯,及时只接收一个广播,也可以进行这么一个判断,这样增加了代码的可读性。
因为接收广播的3个操作往往在3个不同的地方,我们直接看内容1的时候,就可以看到是哪个广播触发的内容1。
其次,当后面增加IntentFilter,识别更多的广播时,修改起来也容易一些
良好的编程习惯可以有效的避免繁杂的小错误,以及代码的健壮性和扩展性。