发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的同步绑定服务的方法及相应的装置。
依据本发明的一方面,提供了一种同步绑定服务的方法,应用于绑定服务的客户端,包括:
通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,所述服务管理组件中保存有当前系统中存活的服务的服务接口,所述客户端与所述服务管理组件运行在不同的进程中;
利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口;
在所述客户端与所述待绑定服务的服务接口间建立绑定关系,以为所述客户端提供绑定服务。
可选地,所述服务管理组件实现ServiceProvider,所述ServiceProvider继承自内容提供组件,并覆写query函数;
所述通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,包括:
调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
可选地,调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象,包括:
生成标识所述服务管理组件的IBinder对象的URI;
调用所述ServiceProvider的query函数,由所述ServiceProvider的query函数根据生成的所述URI,查找所述服务管理组件的IBinder对象;
接收所述ServiceProvider的query函数返回的、封装有所述服务管理组件的IBinder对象的Cursor;
从所述Cursor中提取所述服务管理组件的IBinder对象。
可选地,在调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,所述方法还包括:
在所述客户端所在进程中缓存所述服务管理组件的IBinder对象。
可选地,在调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之前,所述方法还包括:
在所述客户端所在进程的缓存中查找所述服务管理组件的IBinder对象;
若未查找到,则触发调用操作。
可选地,在利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之前,所述方法还包括:
判断所述待绑定服务的进程是否已启动;
若是,则触发获取操作。
可选地,利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口,包括:
调用所述服务管理组件的IBinder对象的getService函数,在所述服务管理组件中查找待绑定服务的服务接口。
可选地,在利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之后,所述方法还包括:
在所述客户端所在进程中缓存所述待绑定服务的服务接口。
可选地,所述方法还包括:
当存在新启动的服务时,调用所述服务管理组件的IBinder对象的addService函数,将所述新启动的服务的服务接口注册到所述服务管理组件中。
可选地,所述方法还包括:
当存在停止的服务时,调用所述服务管理组件的IBinder对象的removeService函数,从所述服务管理组件中删除所述停止的服务的服务接口。
可选地,在通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象之前,所述方法还包括:
在所述客户端所在进程的缓存中查找所述待绑定服务的服务接口;
若查找到,则利用查找到的所述待绑定服务的服务接口,对所述待绑定服务进行绑定;
若未查找到,则触发获取操作。
依据本发明的另一方面,还提供了一种同步绑定服务的装置,应用于绑定服务的客户端,包括:
IBinder对象获取模块,适于通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,所述服务管理组件中保存有当前系统中存活的服务的服务接口,所述客户端与所述服务管理组件运行在不同的进程中;
服务接口获取模块,适于利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口;
服务绑定模块,适于在所述客户端与所述待绑定服务的服务接口间建立绑定关系,以为所述客户端提供绑定服务。
可选地,所述服务管理组件实现ServiceProvider,所述ServiceProvider继承自内容提供组件,并覆写query函数;
所述IBinder对象获取模块还适于:
调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
可选地,所述IBinder对象获取模块还适于:
生成标识所述服务管理组件的IBinder对象的URI;
调用所述ServiceProvider的query函数,由所述ServiceProvider的query函数根据生成的所述URI,查找所述服务管理组件的IBinder对象;
接收所述ServiceProvider的query函数返回的、封装有所述服务管理组件的IBinder对象的Cursor;
从所述Cursor中提取所述服务管理组件的IBinder对象。
可选地,所述装置还包括:
第一缓存模块,适于在所述IBinder对象获取模块调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,在所述客户端所在进程中缓存所述服务管理组件的IBinder对象。
可选地,所述装置还包括:
第一查找模块,适于在所述IBinder对象获取模块调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在所述客户端所在进程的缓存中查找所述服务管理组件的IBinder对象;若未查找到,则触发调用操作。
可选地,所述装置还包括:
判断模块,适于在所述服务接口获取模块利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之前,判断所述待绑定服务的进程是否已启动;若是,则触发获取操作。
可选地,所述服务接口获取模块还适于:
调用所述服务管理组件的IBinder对象的getService函数,在所述服务管理组件中查找待绑定服务的服务接口。
可选地,所述装置还包括:
第二缓存模块,适于在所述服务接口获取模块利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之后,在所述客户端所在进程中缓存所述待绑定服务的服务接口。
可选地,所述装置还包括:
注册模块,适于当存在新启动的服务时,调用所述服务管理组件的IBinder对象的addService函数,将所述新启动的服务的服务接口注册到所述服务管理组件中。
可选地,所述装置还包括:
删除模块,适于当存在停止的服务时,调用所述服务管理组件的IBinder对象的removeService函数,从所述服务管理组件中删除所述停止的服务的服务接口。
可选地,所述装置还包括:
第二查找模块,适于在所述IBinder对象获取模块通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在所述客户端所在进程的缓存中查找所述待绑定服务的服务接口;若查找到,则利用查找到的所述待绑定服务的服务接口,对所述待绑定服务进行绑定;若未查找到,则触发获取操作。
本发明实施例中,通过运行在常驻进程中的服务管理组件来管理当前系统中存活的服务的服务接口,当客户端需要绑定服务(这里,客户端与服务运行在不同的进程中)时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,从而在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。由此,本发明实施例可以直接从服务管理组件处来获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取待绑定服务的IBinder对象,进而调用待绑定服务的IBinder对象来获得待绑定服务的服务接口,提高了客户端绑定服务的效率。并且,本发明实施例在从服务管理组件处来获取待绑定服务的服务接口时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取服务管理组件的IBinder对象,省去了繁琐的调用操作,进一步提高了客户端绑定服务的效率,并减少了开发流程。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
在Android系统中,可以通过Binder机制来实现不同的进程间通信。Android对Binder机制进行了抽象,定义了IBinder对象或接口,该接口是对跨进程对象的抽象。IBinder定义了一套使用Binder机制来实现跨进程间的通信协议,它可以位于“frameworks\base\inculde\binder\IBinder.h”文件中。一个普通对象只能在当前进程中被访问,如果希望它能被其他进程访问,就必须实现IBinder对象或接口。
在本发明实施例中,绑定服务的客户端可以如应用程序或组件等,如前文所述,该客户端与服务有可能运行在不同的进程中。现有的Android系统是采用异步回调的方式来获取服务的IBinder对象,进而调用这个IBinder对象的指定函数(如,getService函数)来获得该服务的接口,从而实现服务的绑定。然而,若即将被绑定的服务已经启动,如果仍然通过传递回调、接收回调的方式,则调用频繁导致效率较低,且开发流程也较为复杂。
为解决上述技术问题,本发明实施例提供了一种同步绑定服务的方法,应用于绑定服务的客户端。图1示出了根据本发明一个实施例的同步绑定服务的方法的流程图。如图1所示,该方法至少包括以下步骤S102至步骤S106:
步骤S102,通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,服务管理组件中保存有当前系统中存活的服务的服务接口,客户端与服务管理组件运行在不同的进程中;
步骤S104,利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口;
步骤S106,在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。
本发明实施例中,通过运行在常驻进程中的服务管理组件来管理当前系统中存活的服务的服务接口,当客户端需要绑定服务(这里,客户端与服务运行在不同的进程中)时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,从而在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。由此,本发明实施例可以直接从服务管理组件处来获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取待绑定服务的IBinder对象,进而调用待绑定服务的IBinder对象来获得待绑定服务的服务接口,提高了客户端绑定服务的效率。并且,本发明实施例在从服务管理组件处来获取待绑定服务的服务接口时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取服务管理组件的IBinder对象,省去了繁琐的调用操作,进一步提高了客户端绑定服务的效率,并减少了开发流程。
在上文步骤S102中,服务管理组件运行在常驻进程(即,后台一直持有的进程)中,服务管理组件可以实现ServiceProvider,ServiceProvider是继承自ContentProvider(内容提供组件),并覆写ContentProvider中的query(查询)函数。
在Android系统中,ContentProvider可以为不同的应用程序访问相同的数据提供统一的入口。ContentProvider和应用程序组件Activity、Service(服务)一样,需要在AndroidManifest.xml文件中配置之后才能使用。系统在安装包含ContentProvider的应用程序的时候,会把这些ContentProvider的描述信息保存起来,其中最重要的就是ContentProvider的Authority信息。另外,安装应用程序的时候,并不会把相应的ContentProvider加载到内存中来,系统采取的是懒加载的机制,等到第一次要使用这个ContentProvider的时候,系统才会把它加载到内存中来,下次再要使用这个ContentProvider的时候,就可以直接返回了。
本发明实施例提供了一种可选地实施步骤S102的方案,在该方案中,可以调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
当需要从ContentProvider获取数据时,可以使用该ContentProvider提供的URI(统一资源标识符,Uniform Resource Identifier),ContentProvider定义的URI对该ContentProvider是唯一的。
通常,可以把一个URI看作是一个网址,分为三部分:
第一部分是“content://”,可以看作是网址中的“http://”;
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它,可以看作是网址中的主机名,比如“blog.csdn.net”;
第三部分是路径名,用来表示将要操作的数据,可以看作网址中细分的内容路径。
图2示出了根据本发明一个实施例的调用query函数获取服务管理组件的IBinder对象的方法的流程图。如图2所示,该方法至少包括以下步骤S202至步骤S208。
步骤S202,生成标识服务管理组件的IBinder对象的URI。
步骤S204,调用ServiceProvider的query函数,由ServiceProvider的query函数根据生成的URI,查找服务管理组件的IBinder对象。
步骤S206,接收ServiceProvider的query函数返回的、封装有服务管理组件的IBinder对象的Cursor。
在Android系统中,通常可以把查询到的结果集封装在一个Cursor对象当中,Cursor就像是结果集上的一个游标,可以对结果集进行向前、向后或随机的访问。而Cursor本身是一个接口类,提供了对结果集访问的一些抽象方法,根据功能的不同在其子类有着不同的实现。
步骤S208,从Cursor中提取服务管理组件的IBinder对象。
在本发明实施例中,由ServiceProvider继承自ContentProvider,并覆写ContentProvider中的query函数,利用ContentProvider的通信方式(即,上述步骤S202至步骤S208),实现了直接获取服务管理组件的IBinder对象的目的,解决现有技术中需要通过传递回调、接收回调的方式来获取服务管理组件的IBinder对象的问题,省去了繁琐的调用操作,进一步提高了客户端绑定服务的效率,并减少了开发流程。
在本发明一实施例中,在调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,还可以在客户端所在进程中缓存服务管理组件的IBinder对象,以备后续使用。例如,在以后需要获取服务管理组件的IBinder对象时,可以首先在客户端所在进程的缓存中查找服务管理组件的IBinder对象,若查找到,则直接获取;若未查找到,则触发调用操作,即调用ServiceProvider的query函数,以获取运行在常驻进程中的服务管理组件的IBinder对象。
进一步,若在客户端所在进程的缓存中查找到服务管理组件的IBinder对象,为了确保该服务管理组件的IBinder对象是存活的,则可以调用isBinderAlive函数和/或pingBinder函数来判断该服务管理组件的IBinder对象是否是存活的。
在本发明一实施例中,在步骤S104利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口之前,可以首先判断该待绑定服务是否已经启动,即,判断该待绑定服务的进程是否已启动,若已经启动,则触发获取操作;若还未启动,则可以采用Android系统中现有的异步绑定服务的方式进行,即首先调用BindService函数启动该待绑定服务,然后调用onBind函数,要求该待绑定服务返回一个IBinder对象,接收回调返回的IBinder对象,最后利用IBinder对象获取该待绑定服务的服务接口。
对于步骤S104的实施方式,本发明提供了一种可选的方案,即,调用服务管理组件的IBinder对象的getService函数,在服务管理组件中查找待绑定服务的服务接口。这里,服务管理组件的IBinder对象继承于Binder类,里面实现一个getService函数,用来在服务管理组件中查找待绑定服务的服务接口。
在本发明一实施例中,在步骤S104利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口之后,还可以在客户端所在进程中缓存待绑定服务的服务接口,以备后续使用。例如,在以后需要获取待绑定服务的服务接口时,可以首先在客户端所在进程的缓存中查找待绑定服务的服务接口,若查找到,则直接获取,并在客户端与直接获取到的待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务;若未查找到,则执行步骤S102。
在本发明一实施例中,可以利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,还可以对服务管理组件中保存的服务接口进行管理,如对服务接口进行注册或删除。具体地,当存在新启动的服务时,可以调用服务管理组件的IBinder对象的addService函数,将新启动的服务的服务接口注册到服务管理组件中。当存在停止的服务时,调用服务管理组件的IBinder对象的removeService函数,从服务管理组件中删除停止的服务的服务接口。
下面通过一具体实施例来详细介绍本发明的同步绑定服务的方法的实现过程。在该实施例中,绑定服务的客户端处的调用类为SyncServiceManager,服务管理组件实现IServiceChannel类,服务管理组件的IBinder对象为IServiceChannel对象,通过IServiceChannel对象可以对服务管理组件中保存的当前系统中存活的服务的服务接口进行增加、删除、修改或查找等操作。服务管理组件还实现了ServiceProvider,该ServiceProvider是继承自ContentProvider,并覆写ContentProvider中的query函数。
下面将介绍各个类中实现的函数或方法。
首先,SyncServiceManager类,可以包括以下函数:
1)getService(String serviceName):IBinder
获取待绑定服务的服务接口,该服务接口可以用IBinder来表示;
2)addService(String serviceName,IBinder)
动态添加或注册一个服务的服务接口,具体可以调用服务管理组件的IServiceChannel.addService函数即可;
3)removeService(String serviceName)
移除一个之前添加过的服务的服务接口,同addService一样,需要调用IServiceChannel.removeService函数即可;
4)getServiceChannel():IServiceChannel
获取IServiceChannel对象,该对象是Binder.Proxy接口,可以直接通过该接口和常驻进程的IServiceChannel做通讯。
其次,IServiceChannel类,可以包括以下函数:
1)getService
用来在服务管理组件中查找待绑定服务的服务接口;
2)addService
将新启动的服务的服务接口注册到服务管理组件中;
3)removeService
从服务管理组件中删除停止的服务的服务接口;
4)getService(String serviceName):IBinder
获取待绑定服务的服务接口,该服务接口可以用IBinder来表示。
图3示出了根据本发明另一个实施例的同步绑定服务的方法的流程图,该方法应用在绑定服务的客户端。如图3所示,该方法至少包括以下步骤S302至步骤S314:
步骤S302,判断待绑定服务是否已经启动,若否,则继续执行步骤S304;若是,则执行步骤S306。
步骤S304,采用Android系统中现有的异步绑定服务的方式进行,即首先调用BindService函数启动该待绑定服务,然后调用onBind函数,要求该待绑定服务返回一个IBinder对象,接收回调返回的IBinder对象,最后利用IBinder对象获取该待绑定服务的服务接口。
步骤S306,判断在客户端所在进程的缓存中是否查找到待绑定服务的服务接口,若查找到,则继续执行步骤S308;若未查找到,则继续执行步骤S310。
步骤S308,直接获取待绑定服务的服务接口,并在客户端与直接获取到的待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。
步骤S310,调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象(即,IServiceChannel对象)。
该步骤中,可以采用图2所示的流程进行,可以定义ServiceChannelCursor类来实现,该ServiceChannelCursor继承自MatrixCursor,包括以下函数:
1)getBinder(Cursor):IBinder
可以由客户端调用,通过ServiceProvider传递过来的Cursor来读取IBinder对象;
2)makeCursor(IBinder):Cursor
可以由服务管理组件所在常驻进程调用,通过IBinder来构建Cursor,然后将其传递给客户端。
在步骤S310调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,还可以在客户端所在进程中缓存服务管理组件的IBinder对象,以备后续使用。
在本发明的另一实施例中,还可以在客户端所在进程的缓存中查找服务管理组件的IBinder对象,若查找到,则直接获取;若未查找到,则触发调用操作,即调用ServiceProvider的query函数,以获取运行在常驻进程中的服务管理组件的IBinder对象。
步骤S312,调用服务管理组件的IBinder对象的getService函数,在服务管理组件中查找待绑定服务的服务接口。
在该步骤中,可以调用IServiceChannel.getService函数,服务管理组件的IBinder对象继承于Binder类,里面实现一个getService函数,用来在服务管理组件中查找待绑定服务的服务接口。
步骤S314,在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。
本发明实施例中,绑定服务的客户端(SyncServiceManager)可以直接从服务管理组件(IServiceChannel)处来获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取待绑定服务的IBinder对象,进而调用待绑定服务的IBinder对象来获得待绑定服务的服务接口,提高了客户端绑定服务的效率。并且,本发明实施例,绑定服务的客户端(SyncServiceManager)从服务管理组件(IServiceChannel)处获取待绑定服务的服务接口时,可以直接通过特定的通信通道(即,ServiceProvider,该ServiceProvider是继承自ContentProvider,并覆写ContentProvider中的query函数),首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取服务管理组件的IBinder对象,省去了繁琐的调用操作,进一步提高了客户端绑定服务的效率,并减少了开发流程。
基于上文各个实施例提供的同步绑定服务的方法,基于同一发明构思,本发明实施例还提供了一种同步绑定服务的装置。
图4示出了根据本发明一个实施例的同步绑定服务的装置的结构示意图。如图4所示,该装置400至少可以包括IBinder对象获取模块410、服务接口获取模块420以及服务绑定模块430。
IBinder对象获取模块410,适于通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,服务管理组件中保存有当前系统中存活的服务的服务接口,客户端与服务管理组件运行在不同的进程中;
服务接口获取模块420,与IBinder对象获取模块410相耦合,适于利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口;
服务绑定模块430,与服务接口获取模块420相耦合,适于在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。
在本发明一实施例中,服务管理组件实现ServiceProvider,该ServiceProvider继承自内容提供组件,并覆写query函数;
IBinder对象获取模块410还适于:
调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
在本发明一实施例中,IBinder对象获取模块410还适于:
生成标识服务管理组件的IBinder对象的URI;
调用ServiceProvider的query函数,由ServiceProvider的query函数根据生成的URI,查找服务管理组件的IBinder对象;
接收ServiceProvider的query函数返回的、封装有服务管理组件的IBinder对象的Cursor;
从Cursor中提取服务管理组件的IBinder对象。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
第一缓存模块440,与IBinder对象获取模块410相耦合,适于在IBinder对象获取模块410调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,在客户端所在进程中缓存服务管理组件的IBinder对象。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
第一查找模块450,与IBinder对象获取模块410相耦合,适于在IBinder对象获取模块410调用ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在客户端所在进程的缓存中查找服务管理组件的IBinder对象;若未查找到,则触发调用操作。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
判断模块460,与服务接口获取模块420相耦合,适于在服务接口获取模块420利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口之前,判断待绑定服务的进程是否已启动;若是,则触发获取操作。
在本发明一实施例中,服务接口获取模块420还适于:
调用服务管理组件的IBinder对象的getService函数,在服务管理组件中查找待绑定服务的服务接口。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
第二缓存模块470,与服务接口获取模块420相耦合,适于在服务接口获取模块420利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口之后,在客户端所在进程中缓存待绑定服务的服务接口。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
注册模块480,与IBinder对象获取模块410相耦合,适于当存在新启动的服务时,调用服务管理组件的IBinder对象的addService函数,将新启动的服务的服务接口注册到服务管理组件中。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
删除模块490,与IBinder对象获取模块410相耦合,适于当存在停止的服务时,调用服务管理组件的IBinder对象的removeService函数,从服务管理组件中删除停止的服务的服务接口。
在本发明一实施例中,如图5所示,同步绑定服务的装置400还可以包括:
第二查找模块4010,与IBinder对象获取模块410相耦合,适于在IBinder对象获取模块410通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在客户端所在进程的缓存中查找待绑定服务的服务接口;若查找到,则利用查找到的待绑定服务的服务接口,对待绑定服务进行绑定;若未查找到,则触发获取操作。
根据上述任意一个优选实施例或多个优选实施例的组合,本发明实施例能够达到如下有益效果:
本发明实施例中,通过运行在常驻进程中的服务管理组件来管理当前系统中存活的服务的服务接口,当客户端需要绑定服务(这里,客户端与服务运行在不同的进程中)时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,从而在客户端与待绑定服务的服务接口间建立绑定关系,以为客户端提供绑定服务。由此,本发明实施例可以直接从服务管理组件处来获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取待绑定服务的IBinder对象,进而调用待绑定服务的IBinder对象来获得待绑定服务的服务接口,提高了客户端绑定服务的效率。并且,本发明实施例在从服务管理组件处来获取待绑定服务的服务接口时,可以直接通过特定的通信通道,首先获取服务管理组件的IBinder对象,进而利用获取的服务管理组件的IBinder对象,从服务管理组件中获取待绑定服务的服务接口,无需通过传递回调、接收回调的方式来获取服务管理组件的IBinder对象,省去了繁琐的调用操作,进一步提高了客户端绑定服务的效率,并减少了开发流程。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的同步绑定服务的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
至此,本领域技术人员应认识到,虽然本文已详尽示出和描述了本发明的多个示例性实施例,但是,在不脱离本发明精神和范围的情况下,仍可根据本发明公开的内容直接确定或推导出符合本发明原理的许多其他变型或修改。因此,本发明的范围应被理解和认定为覆盖了所有这些其他变型或修改。
本发明实施例还公开了:A1、一种同步绑定服务的方法,应用于绑定服务的客户端,包括:
通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,所述服务管理组件中保存有当前系统中存活的服务的服务接口,所述客户端与所述服务管理组件运行在不同的进程中;
利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口;
在所述客户端与所述待绑定服务的服务接口间建立绑定关系,以为所述客户端提供绑定服务。
A2、根据A1所述的方法,其中,
所述服务管理组件实现ServiceProvider,所述ServiceProvider继承自内容提供组件,并覆写query函数;
所述通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,包括:
调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
A3、根据A2所述的方法,其中,调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象,包括:
生成标识所述服务管理组件的IBinder对象的URI;
调用所述ServiceProvider的query函数,由所述ServiceProvider的query函数根据生成的所述URI,查找所述服务管理组件的IBinder对象;
接收所述ServiceProvider的query函数返回的、封装有所述服务管理组件的IBinder对象的Cursor;
从所述Cursor中提取所述服务管理组件的IBinder对象。
A4、根据A2或A3所述的方法,其中,在调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,所述方法还包括:
在所述客户端所在进程中缓存所述服务管理组件的IBinder对象。
A5、根据A2或A3所述的方法,其中,在调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之前,所述方法还包括:
在所述客户端所在进程的缓存中查找所述服务管理组件的IBinder对象;
若未查找到,则触发调用操作。
A6、根据A1-A5任一项所述的方法,其中,在利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之前,所述方法还包括:
判断所述待绑定服务的进程是否已启动;
若是,则触发获取操作。
A7、根据A1-A6任一项所述的方法,其中,利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口,包括:
调用所述服务管理组件的IBinder对象的getService函数,在所述服务管理组件中查找待绑定服务的服务接口。
A8、根据A1-A7任一项所述的方法,其中,在利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之后,所述方法还包括:
在所述客户端所在进程中缓存所述待绑定服务的服务接口。
A9、根据A1-A8任一项所述的方法,其中,还包括:
当存在新启动的服务时,调用所述服务管理组件的IBinder对象的addService函数,将所述新启动的服务的服务接口注册到所述服务管理组件中。
A10、根据A1-A9任一项所述的方法,其中,还包括:
当存在停止的服务时,调用所述服务管理组件的IBinder对象的removeService函数,从所述服务管理组件中删除所述停止的服务的服务接口。
A11、根据A1-A10任一项所述的方法,其中,在通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象之前,所述方法还包括:
在所述客户端所在进程的缓存中查找所述待绑定服务的服务接口;
若查找到,则利用查找到的所述待绑定服务的服务接口,对所述待绑定服务进行绑定;
若未查找到,则触发获取操作。
B12、一种同步绑定服务的装置,应用于绑定服务的客户端,包括:
IBinder对象获取模块,适于通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象,其中,所述服务管理组件中保存有当前系统中存活的服务的服务接口,所述客户端与所述服务管理组件运行在不同的进程中;
服务接口获取模块,适于利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口;
服务绑定模块,适于在所述客户端与所述待绑定服务的服务接口间建立绑定关系,以为所述客户端提供绑定服务。
B13、根据B12所述的装置,其中,
所述服务管理组件实现ServiceProvider,所述ServiceProvider继承自内容提供组件,并覆写query函数;
所述IBinder对象获取模块还适于:
调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象。
B14、根据B13所述的装置,其中,所述IBinder对象获取模块还适于:
生成标识所述服务管理组件的IBinder对象的URI;
调用所述ServiceProvider的query函数,由所述ServiceProvider的query函数根据生成的所述URI,查找所述服务管理组件的IBinder对象;
接收所述ServiceProvider的query函数返回的、封装有所述服务管理组件的IBinder对象的Cursor;
从所述Cursor中提取所述服务管理组件的IBinder对象。
B15、根据B13或B14所述的装置,其中,还包括:
第一缓存模块,适于在所述IBinder对象获取模块调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之后,在所述客户端所在进程中缓存所述服务管理组件的IBinder对象。
B16、根据B13或B14所述的装置,其中,还包括:
第一查找模块,适于在所述IBinder对象获取模块调用所述ServiceProvider的query函数,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在所述客户端所在进程的缓存中查找所述服务管理组件的IBinder对象;若未查找到,则触发调用操作。
B17、根据B12-B16任一项所述的装置,其中,还包括:
判断模块,适于在所述服务接口获取模块利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之前,判断所述待绑定服务的进程是否已启动;若是,则触发获取操作。
B18、根据B12-B17任一项所述的装置,其中,所述服务接口获取模块还适于:
调用所述服务管理组件的IBinder对象的getService函数,在所述服务管理组件中查找待绑定服务的服务接口。
B19、根据B12-B18任一项所述的装置,其中,还包括:
第二缓存模块,适于在所述服务接口获取模块利用获取的所述服务管理组件的IBinder对象,从所述服务管理组件中获取待绑定服务的服务接口之后,在所述客户端所在进程中缓存所述待绑定服务的服务接口。
B20、根据B12-B19任一项所述的装置,其中,还包括:
注册模块,适于当存在新启动的服务时,调用所述服务管理组件的IBinder对象的addService函数,将所述新启动的服务的服务接口注册到所述服务管理组件中。
B21、根据B12-B20任一项所述的装置,其中,还包括:
删除模块,适于当存在停止的服务时,调用所述服务管理组件的IBinder对象的removeService函数,从所述服务管理组件中删除所述停止的服务的服务接口。
B22、根据B12-B21任一项所述的装置,其中,还包括:
第二查找模块,适于在所述IBinder对象获取模块通过特定的通信通道,获取运行在常驻进程中的服务管理组件的IBinder对象之前,在所述客户端所在进程的缓存中查找所述待绑定服务的服务接口;若查找到,则利用查找到的所述待绑定服务的服务接口,对所述待绑定服务进行绑定;若未查找到,则触发获取操作。