Receiver的原理
一、注册的过程
通过ContextWrapper的registerReceiver,但是实际上工作的是ContextImpllai 来完成的
真正做注册的是通过registerReceiverInternal方法在这个方法里。
注册的过程也是一个进程间通信的过程。把BroadcastReceiver封装成IIntentReceiver,BroadCastReceiver作为Android的一个组件是不能直接跨进程传递的,IIntentReceiver是一个Binder的接口,通过IIntentReceiver中转一下。
IIntentReceiver的实现类是ReceiverDispatch的InnerReceiver
ActivityManagerNative.getDefault()内部其实是ServiceManager提供的IBinder,他就是ActivityManagerService的引用
通过ActivityManagerService的registerReceiver方法就把 远程的IIntentReceiver和IntentFilter注册到服务中了。
二、广播的发送
通过ContextImpl的sendBrocast的方法实现的
通过ActivityManagerNative.getDefault().broadcastIntent();
ContextImpl什么也没干 直接向ActivityManagerService发送了一个异步请求。
broadcastIntent里面 调用了broadcastIntentLocked,这里的Intent.addFlag(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES)
这是发送给除了已经被停止的应用的app,这是在android3.1开始有的特性,在android5.0中默认的Intent.FLAG_EXCLUDE_STOPPED_PACKAGES,如果想启动已经被停止的app,设置flag:Intent.FLAG_INCLUDE_STOPPED_PACKAGES 这个flag是启动包括已经停止的广播
broadcastIntentLocked,会根据intent_filter匹配广播的接受者 然后放入一个BroadcastQueue中,这样广播就发送给相应的接受者
内部调用了app.thread.scheduleRegisterReceiver,这就是ActivityThread里面的方法,通过一个handler发送一个消息 然后调用
BroadcastReceiver里面的onReceiver