ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:84.51KB ,
资源ID:12810004      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12810004.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(#Android应用程序广播接收器registerReceiver过程分析.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

#Android应用程序广播接收器registerReceiver过程分析.docx

1、#Android应用程序广播接收器registerReceiver过程分析 前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息;而对Android应用程序来说,订阅消息其实就是注册广播接收器,本文将探讨Android应用程序是如何注册广播接收器以及把广播接收器注册到哪里去的。 在Android的广播机制中,ActivityManagerService扮演着广播中心的角色,负责系统中所有广播的注册和发布操作,因此,Android应用程序注册广播接收器的过程就把是广播接收器注册到ActivityManagerServi

2、ce的过程。Android应用程序是通过调用ContextWrapper类的registerReceiver函数来把广播接收器BroadcastReceiver注册到ActivityManagerService中去的,而ContextWrapper类本身又借助ContextImpl类来注册广播接收器。 在Android应用程序框架中,Activity和Service类都继承了ContextWrapper类,因此,我们可以在Activity或者Service的子类中调用registerReceiver函数来注册广播接收器。Activity、Service、ContextWrapper和Conte

3、xtImpl这四个类的关系可以参考前面Android系统在新进程中启动自定义服务过程startService)的原理分析一文中描述的Activity类图。 这篇文章还是继续以实例来进行情景分析,所用到的例子便是上一篇文章Android系统中的广播Broadcast)机制简要介绍和学习计划里面介绍的应用程序了,所以希望读者在继续阅读本文之前,先看看这篇文章;又因为Android应用程序是把广播接器注册到ActivityManagerService中去的,因此,这里又会涉入到Binder进程间通信机制,所以希望读者对Android系统的Binder进程间通信机制有所了解,具体请参考Android进

4、程间通信IPC)机制Binder简要介绍和学习计划一文。 开始进入主题了,在Android系统中的广播6.super.onResume(。7.8.IntentFiltercounterActionFilter=newIntentFilter(CounterService.BROADCAST_COUNTER_ACTION。9.registerReceiver(counterActionReceiver,counterActionFilter。10.11.12.13.14. MainActivity在onResume函数里,通过其父类ContextWrapper的registerReceiver函

5、数注册了一个BroadcastReceiver实例counterActionReceiver,并且通过IntentFilter实例counterActionFilter告诉ActivityManagerService,它要订阅的广播是CounterService.BROADCAST_COUNTER_ACTION类型的,这样,ActivityManagerService在收到CounterService.BROADCAST_COUNTER_ACTION类型的广播时,就会分发给counterActionReceiver实例的onReceive函数。 接下来,就开始分析注册过程中的每一个步骤了。 S

6、tep 1. ContextWrapper.registerReceiver 这个函数实现在frameworks/base/core/java/android/content/ContextWrapper.java文件中:view plain1.publicclassContextWrapperextendsContext2.ContextmBase。3.4.5.Override6.publicIntentregisterReceiver(7.BroadcastReceiverreceiver,IntentFilterfilter8.returnmBase.registerReceiver(r

7、eceiver,filter。9.10.11.12.13. 这里的成员变量mBase是一个ContextImpl实例,想知道为什么,可以回过头去看看Android应用程序启动过程源代码分析这篇文章6.returnregisterReceiver(receiver,filter,null,null。7.8.9.Override10.publicIntentregisterReceiver(BroadcastReceiverreceiver,IntentFilterfilter,11.StringbroadcastPermission,Handlerscheduler12.returnregist

8、erReceiverInternal(receiver,filter,broadcastPermission,13.scheduler,getOuterContext(。14.15.16.privateIntentregisterReceiverInternal(BroadcastReceiverreceiver,17.IntentFilterfilter,StringbroadcastPermission,18.Handlerscheduler,Contextcontext19.IIntentReceiverrd=null。20.if(receiver!=null21.if(mPackage

9、Info!=null&context!=null22.if(scheduler=null23.scheduler=mMainThread.getHandler(。24.25.rd=mPackageInfo.getReceiverDispatcher(26.receiver,context,scheduler,27.mMainThread.getInstrumentation(,true。28.else29.30.31.32.try33.returnActivityManagerNative.getDefault(.registerReceiver(34.mMainThread.getAppli

10、cationThread(,35.rd,filter,broadcastPermission。36.catch(RemoteExceptione37.returnnull。38.39.40.41.42.43. 通过两个函数的中转,最终就进入到ContextImpl.registerReceiverInternal这个函数来了。这里的成员变量mPackageInfo是一个LoadedApk实例,它是用来负责处理广播的接收的,在后面一篇文章讲到广播的发送时。5.6.privatefinalclassHextendsHandler7.8.9.publicvoidhandleMessage(Messa

11、gemsg10.11.12.switch(msg.what13.14.15.16.17.18.19.20.21.22.23.24.25.finalHandlergetHandler(26.returnmH。27.28.29.30.31. 有了这个Handler之后,就可以分发消息给应用程序处理了。 再回到上一步的ContextImpl.registerReceiverInternal函数中,它通过mPackageInfo.getReceiverDispatcher函数获得一个IIntentReceiver接口对象rd,这是一个Binder对象,接下来会把它传给ActivityManagerSe

12、rvice,ActivityManagerService在收到相应的广播时,就是通过这个Binder对象来通知MainActivity来接收的。 我们也是先来看一下mPackageInfo.getReceiverDispatcher函数的实现,然后再回过头来继续分析ContextImpl.registerReceiverInternal函数。 Step 4. LoadedApk.getReceiverDispatcher 这个函数实现在frameworks/base/core/java/android/app/LoadedApk.java文件中:view plain1.finalclassLo

13、adedApk2.3.4.publicIIntentReceivergetReceiverDispatcher(BroadcastReceiverr,5.Contextcontext,Handlerhandler,6.Instrumentationinstrumentation,booleanregistered7.synchronized(mReceivers8.LoadedApk.ReceiverDispatcherrd=null。9.HashMapmap=null。10.if(registered11.map=mReceivers.get(context。12.if(map!=null1

14、3.rd=map.get(r。14.15.16.if(rd=null17.rd=newReceiverDispatcher(r,context,handler,18.instrumentation,registered。19.if(registered20.if(map=null21.map=newHashMap(。22.mReceivers.put(context,map。23.24.map.put(r,rd。25.26.else27.rd.validate(context,handler。28.29.returnrd.getIIntentReceiver(。30.31.32.33.34.3

15、5.staticfinalclassReceiverDispatcher36.37.finalstaticclassInnerReceiverextendsIIntentReceiver.Stub38.finalWeakReferencemDispatcher。39.40.41.InnerReceiver(LoadedApk.ReceiverDispatcherrd,booleanstrong42.mDispatcher=newWeakReference(rd。43.44.45.46.47.48.49.50.51.finalIIntentReceiver.StubmIIntentReceive

16、r。52.finalHandlermActivityThread。53.54.55.56.ReceiverDispatcher(BroadcastReceiverreceiver,Contextcontext,57.HandleractivityThread,Instrumentationinstrumentation,58.booleanregistered59.60.61.mIIntentReceiver=newInnerReceiver(this,!registered。62.mActivityThread=activityThread。63.64.65.66.67.68.69.IInt

17、entReceivergetIIntentReceiver(70.returnmIIntentReceiver。71.72.73.74.75.76.77. 在LoadedApk.getReceiverDispatcher函数中,首先看一下参数r是不是已经有相应的ReceiverDispatcher存在了,如果有,就直接返回了,否则就新建一个ReceiverDispatcher,并且以r为Key值保在一个HashMap中,而这个HashMap以Context,这里即为MainActivity为Key值保存在LoadedApk的成员变量mReceivers中,这样,只要给定一个Activity和B

18、roadcastReceiver,就可以查看LoadedApk里面是否已经存在相应的广播接收发布器ReceiverDispatcher了。 在新建广播接收发布器ReceiverDispatcher时,会在构造函数里面创建一个InnerReceiver实例,这是一个Binder对象,实现了IIntentReceiver接口,可以通过ReceiverDispatcher.getIIntentReceiver函数来获得,获得后就会把它传给ActivityManagerService,以便接收广播。在ReceiverDispatcher类的构造函数中,还会把传进来的Handle类型的参数activit

19、yThread保存下来,以便后面在分发广播的时候使用。 现在,再回到ContextImpl.registerReceiverInternal函数,在获得了IIntentReceiver类型的Binder对象后,就开始要把它注册到ActivityManagerService中去了。 Step 5. ActivityManagerProxy.registerReceiver 这个函数实现在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:view plain1.classActivityManagerProxyimplementsIActivityManager2.3.4.5.publicIntentregisterReceiver(IApplicationThreadcaller,6.IIntentReceiverreceiver,7.IntentFilterfilter,Stringpe

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1