服务至活动间的通信方法

文档序号:9597733阅读:421来源:国知局
服务至活动间的通信方法
【技术领域】
[0001] 本发明涉及通信领域,尤其涉及一种服务至活动间的通信方法。
【背景技术】
[0002] 在Android(安卓)系统中,活动(Activity)负责前台界面的显示和管理,月艮 务(Service)负责没有界面的相关功能。当需要使用没有界面的相关功能时,通过定 义服务来完成,服务运行在主线程,没有任何界面显示。活动可以通过Android提供的 startservice (开始服务)函数来启动服务,如果服务已经启动,则通过开始服务可以传递 命令到服务中,服务收到该命令后,进行相关的功能操作。如果活动需要获取服务中相关数 据,活动可以绑定服务,从而来调用服务中提供的接口函数,获取服务中相关信息,调用服 务提供的对外接口函数,获取服务的相关数据和运行状态。活动处于主动地位,服务处于被 动地位。在服务的运行过程中,产生相关事件后,只能保存在服务实体中,等待活动主动来 获取相关事件和数据。服务没有办法主动通知对该服务感兴趣的相关活动。活动要想获得 服务的相关事件,只能通过不停查询的方式来调用服务提供的接口,效率低下,操作起来繁 琐,实时性也较差。

【发明内容】

[0003] 由于整个活动与服务之间的操作过程均是活动主动,而服务处于被动地位,服务 完成了某些功能后,需要通过活动管理的界面进行显示相关结果时,需要活动定时去查询, 导致用户体验的效果欠佳。本发明提供了一套服务到活动间的通信方法,使得服务和活动 间的交互方便、高效、实时。
[0004] 本发明采用如下技术方案:
[0005] -种service至activity间的通信方法,应用于Android系统中,所述通信方法 包括:
[0006] 步骤S1,所述service产生事件;
[0007] 步骤S2,判断所述activity和待监听的所述service是否处于同一个应用中;若 是则执行步骤S3,否则直接执行步骤S4 ;
[0008] 步骤S3,在所述应用的主线程中构建service与activity哈希表,所述activity 对所述事件监听对应的service ;
[0009] 步骤S4,远程binder调用接口,进入activity manager service组件后,匹配已 经打开的service列表,建立所述哈希表。
[0010] 对 Service 感兴趣的 Activity 需要 Listen (监听)对应的 Service,当 Service 产生相关事件后,通过Listen的Activity列表,将事件传递给对应的Activity进行处理。 Activity可以调用Listen Service函数还Listen对应的Service产生的事件,同样可 以调用 Unlisten (解监听)Service 函数解除对 Service 的 Listen。Listen Service 和 Unlisten Service两个函数在Activity中实现,作为Activity的基本接口函数,每个创 建的Activity均可以调用。在Listen Service函数中,首先判断Activity和要Listen 的Service是否处于同一个APP (应用)中,对于处于同一 APP中的Activity和Service, 直接在应用的Activity Thread(主线程)构建对应的哈希表,即一个Service对应多个 Activity 的哈希表,一个 Service 可以被多个 Activity 进行 Listen。Activity 和 Service 不处于同一 APP中的情况,贝通过IActivityManager远程Binder (结合)调用接口,进入系 统进程的 Activity Manager (管理)Service 组件,Activity Manager Service 负责管理和 维护所有打开的Service和Activity的生命周期,Activity Manager Service首先会匹配 已经打开的Service列表,确定Activity要Listen的Service是否已经创建,如果Service 没有打开,贝U直接返回,如果Service已经创建,贝建立该Service与Activity之间的哈希 表,一个Service对应多个Activity的哈希表,一个Service可以被多个Activity进行 Listen。
[0011] 优选的,步骤S1还包括:
[0012] 步骤S11,于所述步骤S1之后,调用send Event to activity函数发送所述事件 至 listen activity 中。
[0013] 优选的,所述步骤S2具体包括:
[0014] 步骤S21,进入service所在应用的主线程,查询与所述事件对应的哈希表,判断 是否在同一所述应用中有所述activity在监听所述service^
[0015] 当Service产生事件时,首先会进入Service所在APP的Activity Thread,去 查询对应的Service与Activity的哈希表,如果存在同一 APP中有Activity在Listen 该Service,则发送消息给Activity Thread,Activity Thread收到该消息后,调用对应 Activity的Service事件处理函数(Receive Service Event)对事件进行处理。同时通过 IActivityManager 远程 Binder 调用接口进入系统进程的 Activity Manager Service,查 询对应的Service与Activity的哈希表,确定是否有处于不同APP的Activity在Listen 该Service,然后通过IApplicatinThread远程Binder调用接口进入Activity所在APP的 Activity Thread 中,然后调用 Activity 的 Service事件处理函数Receive Service Event 对事件进行处理。这样就完成了 Service到Activity之间的通信过程。
[0016] 优选的,所述步骤S2具体包括:
[0017] 步骤S22,获取活动名(activity name),进入所述主线程的监听服务(listen service)函数;
[0018] 步骤 S23,调用 service name ;
[0019] 步骤S24,根据所述activity name、所述service name获取活动客户端记录 (activity client record)实体和所述 service 实体;
[0020] 步骤S25,判断所述service name对应的所述service实体是否存在。
[0021] 优选的,所述步骤S3具体包括:
[0022] 步骤S31,创建所述service实体与所述活动客户端记录实体之间的哈希表。
[0023] 优选的,所述步骤S4具体包括:
[0024] 步骤S41,进入活动管理服务(activity manager service)组件后,通过所述服务 名(service name)判断是否能够从所述activity manager service组件中的哈希表中获 取对应的服务记录实体,若是则执行步骤S42,否则结束并提示出错;
[0025] 步骤 S42 :通过所述 activity name 从所述 activity manager service 中获取对 应的活动记录(activity record)实体,建立所述服务记录(service record)实体与所述 活动记录实体的哈希表。
[0026] 优选的,所述通信方法还包括:
[0027] 步骤S5,于所述步骤S4之后,通过所述activity获取所述activity name,进入 所述主线程的所述listen service函数;
[0028] 步骤 S6,调用 service name ;
[0029] 步骤S7,通过所述activity name、所述service name获取活动客户端记录实体 和所述service实体;
[0030] 步骤S8,判断所述service name对应的所述service实体是否存在;若是,贝1J删 除所述service实体与所述活动客户端记录实体之间的对应项;否则进入所述activity manager service删除所述服务记录实体与所述活动记录实体之间的对应项。
[0031] 优选的,所述活动客户端记录实体存在于mActivities中和/或所述service实 体存在于mServices中。
[0032] 优选的,所述activity name和/或所述service name包括包名和类名。
[0033] 优选的,所述步骤S42具体还包括,通过IA
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1