服务至活动间的通信方法_2

文档序号:9597733阅读:来源:国知局
ctivity Manager远程binder调用接 □ 〇
[0034] 本发明的有益效果是:
[0035] 本发明解决了当服务产生事件后,可以主动通知所有对该服务感兴趣的活动,不 论活动和服务是否处于同一 APP中本发明提供的服务到活动间的通信机制,使得服务和活 动间的交互方便、高效、实时。
【附图说明】
[0036] 图1为本发明监听服务实施例一的处理流程图;
[0037] 图2为本发明解监听实施例二的处理流程图;
[0038] 图3为本发明实施例三的原理框图。
【具体实施方式】
[0039] 需要说明的是,在不冲突的情况下,下述技术方案,技术特征之间可以相互组合。
[0040] 下面结合附图对本发明的【具体实施方式】作进一步的说明:
[0041] 实施例一
[0042] 图1为本发明listen service的处理流程图,本实施例主要包括两个部分: Activity 对 Service 的监听(Listen)和解监听(Unlisten),Activity 对 Service 的 Listen和Unlisten相当于Activity对于Service的监听和解监听过程,只有Listen 了 Service的Activity才能够接收到Service产生的事件,当Activity对Service的事件不 再感兴趣时,贝U解除对Service的Listen。
[0043] 当Service产生事件时,当Activity和Service处于同一 APP中时,在对应APP 的主线程(Activity Thread)中构建对应的哈希表进行管理,这样不需要经过系统进程的 Activity Manager Service,当Service有事件产生时,派发效率更高。相反,当Activity 和Service不处于同一 APP时,则通过IActivityManager远程Binder调用接口进入系统 进程的Activity Manager Service组件中构建Service与Activity之间的哈希表。
[0044] Android系统中所有的Activity均继承于Activity类,Activity中定义的 Liseten Service/Unlisten Service 函数,分别可以对应调用 Liseten Service 函数或是 Unlisten Service函数来完成Service的Listen和Unlisten的操作,可以进行如下定义:
[0045] public boolean ListenService(String serviceName);
[0046] public boolean UnlistenService(String serviceName);
[0047] 其中的参数service Name即为对应Service的包名和类名,用来唯一标识 Service。Listen/Unlisten成功后返回true (正确),失败则返回false (错误)。
[0048] 如图1所示,在Activity的Listen Service函数中,需要从Activity中的 Component (成员)Name的mComponent中得到Activity对应的包名和类名,然后调用 Activity Thread 的 Listen Service 函数,可以定义如下:
[0049] public boolean Listen Service (String activity Name,String service Name);
[0050] 相比于 Activity 的 Listen Service 函数,此处多了一个参数:String activity Name,该参数用来标识Activity对应的包名和类名。由于APP的主线程Activity Thread负责管理对应APP下所有打开的Service和Activity,Activity Thread定义 了两个哈希表用来记录所有打开的Service和Activity,HashMap〈IBinder,Activity client record>mActivities 记录该 APP 下所有打开的 Activity,HashMap〈IBinder, Service>mServices记录该APP下所有打开的Service,通过两个参数activity Name和 service Name即可从两个哈希表中通过匹配包名类名找到对应的实体,由于Activity是 打开的,所以确定可以获取到对应的活动客户端记录,如果无法从mServices哈希表中匹 配Service实体,说明Activity需要Listen的Service处于其他APP总,此时需要通过 IActivityManager 远程 Binder 调用接口进入系统进程的 Activity Manager Service 进 行处理,在IActivityManager远程接口对应的Binder线程中,由于Activity Manager Service 负责管理和调度所有 APP 的 Service 和 Activity,Activity Manager Service 中的Array List〈Activity record>mHistory堆栈数据负责记录所有打开的Activity, HashMap〈Component Name,service record>mServices 哈希表记录所有打开的 Service,通 过activity Name和service Name从中就可以匹配到对应的Activity Recored实体和服 务记录实体,如果服务记录实体不存在,说明Activity需要Listen的Service没有创建, Listen过程失败,如果服务记录实体存在,贝丨】仓ij建Activity Manager Service中的服务记 录与活动记录实体之间的哈希表mService Activities。在Activity Thread的Listen Service函数中如果能够从mServices哈利表中匹配到Service实体,贝说明Activity和 Service处于同一个APP中,就创建Activity Thread中的Service与活动客户端记录实体 之间的哈希表 mService Activities。
[0051] 实施例二
[0052] 图2为本发明Unlisten service的的处理流程图,如图2所示,本实施例整个处 理流程同Listen Service类似,此处不再赘述,只是在匹配到了 activity Name和service Name对应的实体后,需要从Listen Service中创建的哈希表mService Activities中删除 activity Name(名)和service Name对应实体的对应项
[0053] 实施例三
[0054] 图3为本发明的原理框图,当Service产生事件后,需要通知到所有Listen该 Service的Activity,由于在应用进程的Activity Thread中保存了同一 APP下的Listen Activity列表,在系统进程的Activity Manager Service中保存了不同APP下的Listen Activity列表,所以派发过程需要涉及到应用进程的Activity Thread和系统进程的 Activity Manager Service,如图 3 所;^,当 Service 产生事件后,通过 Android(安卓) 系统现有的Intent(目的)数据结构将事件打包进去,然后调用Service的事件发送函数 send Event To Activity,具体定义如下:
[0055] public boolean send Event To Activity (Intent service Event);
[0056] 由于Service中的成员String mClass Name直接标识了 Service的包名和类名, 直接调用Activity Thread的的send Event To Activity函数,具体定义如下:
[0057] public boolean send Event To Activity(Intent service Event, String service Name);
[0058] 该函数需要通过service Name从Activity Thread中的哈希表mService Activities中匹配对应的Service与活动客户端记录实体对应项,哈希表 mServiceActivities在Listen Service中创建。如果匹配不到对应项,说明同一个APP 中没有Activity Listen该Service,如果匹配到对应项,则保存Service对应的活动客户 端记
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1