Intent的架构包括三方面:
Client,也就是发送这个Intent的activity;
Server,也就是activityManagerService.java,它主要是负责分发这些Intent给适当的对象;
Target,也就是那些需要处理这个Intent的activity,我们称为Receiver;
Intent的三个主要方面:Action、Data、Category在之前的文档中也有介绍,在此就不在叙述了。
下面回到前面的例子:
Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
mContext.sendBroadcast(intent);
第一句话是构造一个Intent,注意只传入了一个参数,这个参数就是一个Action,没有指定data以及Category;也就是说如果某个Receiver写成这样(在AndroidManifext.xml里面):
<receiver android:name="MediaButtonIntentReceiver">
<intent-filter>
<action android:name="android.media.AUDIO_BECOMING_NOISY" />
</intent-filter> </receiver>
当然,如果不喜欢在.xml里面指定,也可以直接在你的应用里面使用代码注册,调用registerReceiver将你的对象注册到系统中去,效果是一样的。
这样,一旦这个应用监测到这个广播消息之后,他的onReceiver函数就会被调用了。
第二句话的目的是把这个消息广播出去,这个是异步的,也就是说广播出去就没事了,谁关系谁处理,从此和我没有任何关系了。
mContext.sendBroadcast(intent);这句之中的mContex即Application Context,这是一个典型的binder调用,调用之后就转到ActivityManagerNative.java中处理了。从此便进入了另一个世界(跑到服务端去了)。
Android Intent 解析之一,布布扣,bubuko.com