资源描述:
《android深入四大组件(四)广播的注册、发送和接收过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android深入四大组件(四)广播的注册、发送和接收过程1.广播的注册过程BroadcastReceiver的注册分为两种,分别是静态注册和动态注册,静态注册在应用安装时由PackageManagerService来完成注册过程,关于这一过程,我会在后续的介绍PackageManagerService文章中详细介绍。这里只介绍BroadcastReceiver的动态注册。要想动态注册BroadcastReceiver,需要调用registerReceiver方法,它的实现在ContextWrapper中,代码如下所示。frameworks/base/core/J
2、ava/android/content/ContextWrapper.javaOverridepublicIntentregisterReceiver(BroadcastReceiverreceiver,IntentFilterfilter){returnmBase.registerReceiver(receiver,filter);}ContextImpl的registerReceiver方法有很多重载的方法最终会调用registerReceiverInternal方法:frameworks/base/core/java/android/app/ContextI
3、mpl.javaprivateIntentregisterReceiverInternal(BroadcastReceiverreceiver,intuserId,IntentFilterfilter,StringbroadcastPermission,Handlerscheduler,Contextcontext){IIntentReceiverrd=null;if(receiver!=null){if(mPackageInfo!=null&&context!=null){//1if(scheduler==null){scheduler=mMainThread.
4、getHandler();}rd=mPackageInfo.getReceiverDispatcher(receiver,context,scheduler,mMainThread.getInstrumentation(),true);//2}else{if(scheduler==null){scheduler=mMainThread.getHandler();}rd=newLoadedApk.ReceiverDispatcher(receiver,context,scheduler,null,true).getIIntentReceiver();//3}}try
5、{finalIntentintent=ActivityManagerNative.getDefault().registerReceiver(mMainThread.getApplicationThread(),mBasePackageName,rd,filter,broadcastPermission,userId);//4if(intent!=null){intent.setExtrasClassLoader(getClassLoader());intent.prepareToEnterProcess();}returnintent;}catch(Remote
6、Exceptione){throwe.rethrowFromSystemServer();}在注释1处判断如果LoadedApk类型的mPackageInfo不等于null并且context不等null就调用注释2处的代码通过mPackageInfo的getReceiverDispatcher方法获取rd对象,否则就调用注释3处的代码来创建rd对象。注释2和3的代码的目的都是要获取IIntentReceiver类型的rd对象,IIntentReceiver是一个Binder接口,用于进行跨进程的通信,它的具体实现在LoadedApk.ReceiverDispatc
7、her.InnerReceiver,如下所示。frameworks/base/core/java/android/app/LoadedApk.javastaticfinalclassReceiverDispatcher{finalstaticclassInnerReceiverextendsIIntentReceiver.Stub{finalWeakReferencemDispatcher;finalLoadedApk.ReceiverDispatchermStrongRef;InnerReceiver(
8、Loade