发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种。
依据本发明的一个方面,提供了一种Android程序中的组件管理方法,该方法包括:
在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程;
在所述Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容;
当所述插件需要运行所述实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程;
将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中;
启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行。
可选地,在所述启动所述可用进程之前,该方法进一步包括:
获取并加载所述实现特定功能的组件的Class对象。
可选地,所述获取并加载所述实现特定功能的组件的Class对象是指:
从所述插件的配置文件中获取所述实现特定功能的组件的内容;
自定义ClassLoader方法;
由所述自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
可选地,所述在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程包括:
利用所述Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程;
和/或,
利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程。
可选地,所述将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中是指:
将所述实现特定功能的组件的内容封装在ComponentName类中;
通过Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。
可选地,当所述实现特定功能的组件为Service组件时,所述启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行是指:
通过context.startService方法启动所述可用进程,使得所述可用进程对应的Service组件在该进程中运行。
可选地,该方法进一步包括:
在所述Android程序的配置文件中实时记录更新所述Android程序的各进程的进程信息。
可选地,所述进程信息包括以下信息中的一个或多个:
进程编号、进程状态、进程启动/修改状态的时间、进程对应的组件名、进程的ID标识、进程中运行各组件的数量。
可选地,在所述从预留的组件所声明的进程中找到一个可用进程之前,该方法进一步包括:
遍历所述Android程序的所有进程,根据各进程的进程信息,判断是否存在已分配给所述实现特定功能的组件的进程;
是则,直接令所述实现特定功能的组件在该进程中运行,不再执行所述从预留的组件所声明的进程中找到一个可用进程的操作。
可选地,所述从预留的组件所声明的进程中找到一个可用进程包括:
遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;
如果存在一个闲置进程,则将该闲置进程作为可用进程;
如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程。
可选地,所述从预留的组件所声明的进程中找到一个可用进程进一步包括:
如果不存在闲置进程,则强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为可用进程。
可选地,所述遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程包括:
遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于停止状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvide组件r和Binder组件均已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程。
依据本发明的另一个方面,提供了一种Android程序中的组件管理装置,该装置包括:
配置单元,适于在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程;以及适于在所述Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容;
查找单元,适于当所述插件需要运行所述实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程;
启动单元,适于将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中;以及适于启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行。
可选地,所述启动单元,进一步适于获取并加载所述实现特定功能的组件的Class对象。
可选地,所述启动单元,适于从所述插件的配置文件中获取所述实现特定功能的组件的内容;以及适于自定义ClassLoader方法;由所述自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
可选地,所述配置单元,适于利用所述Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程;和/或,适于利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程。
可选地,所述启动单元,适于将所述实现特定功能的组件的内容封装在ComponentName类中;再通过Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。
可选地,当所述实现特定功能的组件为Service组件时,
所述启动单元,适于通过context.startService方法启动所述可用进程,使得所述可用进程对应的Service组件在该进程中运行。
可选地,所述配置单元,进一步适于在所述Android程序的配置文件中实时记录更新所述Android程序的各进程的进程信息。
可选地,所述进程信息包括以下信息中的一个或多个:
进程编号、进程状态、进程启动/修改状态的时间、进程对应的组件名、进程的ID标识、进程中运行各组件的数量。
可选地,所述查找单元,进一步适于遍历所述Android程序的所有进程,根据各进程的进程信息,判断是否存在已分配给所述实现特定功能的组件的进程;是则,直接通知所述启动单元,不再执行所述从预留的组件所声明的进程中找到一个可用进程的操作;
所述启动单元,适于令所述实现特定功能的组件在该进程中运行。
可选地,所述查找单元,适于遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;如果存在一个闲置进程,则将该闲置进程作为可用进程;如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程。
可选地,所述查找单元,进一步适于当不存在闲置进程时,强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为可用进程。
可选地,所述查找单元,适于遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于停止状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvider组件和Binder组件均已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程。
由上述可知,本发明提供的技术方案通过对Android程序的配置文件的预先设置,预留一个或多个组件,并为预留的每个组件声明一个进程,当插件需要运行实现特定功能的组件时,无需重新配置Android程序,直接从预留的组件所声明的进程中找到一个可用进程,将实现特定功能的组件的内容传递给可用进程对应的同类型组件中,该同类型组件在可用进程中的运行即完成了插件中实现特定功能的组件的运行,实现了在Android主程序不升级的前提下,插件对组件的自由定制,由于主程序无需升级,而所扩展的活动组件又便于被打包处理成插件功能模块,因此,每次进行升级时,只需下载相应的插件功能模块即可。这就真正做到了最小化安装,大大节省流量,又不需大量消耗终端的资源,既省流量又能高效运行,使得Android程序的功能扩展更加便捷化、高效化、符合应用需求。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的一种Android程序中的组件管理方法的流程图。如图1所示,该方法包括:
步骤S110,在Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程。
步骤S120,在Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容。
步骤S130,当插件需要运行实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程。
步骤S140,将实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中。
步骤S150,启动可用进程,使得该可用进程对应的同类型组件在该进程中运行。
可见,图1所示的方法通过对Android程序的配置文件的预先设置,预留一个或多个组件,并为预留的每个组件声明一个进程,当插件需要运行实现特定功能的组件时,无需重新配置Android程序,直接从预留的组件所声明的进程中找到一个可用进程,将实现特定功能的组件的内容传递给可用进程对应的同类型组件中,该同类型组件在可用进程中的运行即完成了插件中实现特定功能的组件的运行,实现了在Android主程序不升级的前提下,插件对组件的自由定制,由于主程序无需升级,而所扩展的活动组件又便于被打包处理成插件功能模块,因此,每次进行升级时,只需下载相应的插件功能模块即可。这就真正做到了最小化安装,大大节省流量,又不需大量消耗终端的资源,既省流量又能高效运行,使得Android程序的功能扩展更加便捷化、高效化、符合应用需求。
在本发明的实施例中,Android程序可以是某主程序,即宿主程序,如360手机卫士等;插件可以是指附属程序,如360手机卫士中的“防盗”插件、“开机加速”插件、“日历”插件等,其中实现“防盗”功能的组件、实现“开机加速”功能的组件、实现“日历”功能的组件即为实现特定功能的组件。
AndroidManifest.xml是Android程序的核心配置文件,位于整个项目的根目录,声明了Android程序中所用到的组件,包括它们各自的实现类,能被处理的数据和启动位置等。Service和ContentProvider均是Android程序的常用组件,Service组件是在Android系统后台长时间运行的不与用户交互的组件,ContentProvider组件是为Android程序提供数据内容的组件。在本发明的一个实施例中,图1所示方法的步骤S110在Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程包括:利用所述Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程,即以Service的形式来展现Android程序中预留的多个组件;和/或,利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程,即以ContentProvider的形式来展现Android程序中预留的多个进程。
对应地,图1所示方法的步骤S120在Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容可以是:利用所述Android程序的插件的AndroidManifest.xml文件中的<service>标签声明该插件所要使用的实现特定功能的Service组件的内容;和/或,利用所述Android程序的插件的AndroidManifest.xml文件中的<provider>标签声明该插件所要使用的实现特定功能的ContentProvider组件的内容。
例如,在Android程序的配置文件中预留一个或多个Service组件,即在Android程序的AndroidManifest.xml文件中声明<service>标签属性,代码如下所示:
其中,android:name声明了为Android程序实现Service子类的全名;android:process声明了Service运行的进程名;android:exported声明了调用该Service的权限。可以看到,本例在Android程序的AndroidManifest.xml文件中设置了三个不同的<service>标签,即预留了三个Service组件:com.qihoo360.mobilesafe.loader.s.ServiceN1、com.qihoo360.mobilesafe.loader.s.Service0和com.qihoo360.mobilesafe.loader.s.Service1,三个Service组件分别声明的进程为:默认进程(UI进程)、loader0进程和loader1进程。预留组件的注册比较简单,只需要在代码中写死原在AndroidManifest.xml中的组件即可,在应用程序或插件启动时通过Application.onCreate方法调用。
此外,在Android程序的插件的配置文件中声明了该插件所要使用的实现特定功能的Service组件的内容,即在该插件的AndroidManifest.xml文件中声明<service>标签属性,代码如下所示:
<service android:name=“com.qihoo360.mobilesafe.barcode.BarcodeService”/>
可以看到,本例在插件的AndroidManifest.xml文件中声明了Service组件:com.qihoo360.mobilesafe.barcode.BarcodeService,即声明插件所要使用的实现条形码功能的Service组件的内容。当插件需要运行该BarcodeService组件时,从预留的组件(ServiceN1、Service0和Service1)所声明的进程(默认进程、loader0进程和loader1进程)中找到一个可用进程。若其中loader1进程是可用进程,则将BarcodeService组件的内容传递到所找到的loader1进程对应的同类型组件Service1组件中,启动loader1进程,使得Service1组件在该进程中运行。
在本发明的一个实施例中,图1所示方法的步骤S140将实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中包括:先将所述实现特定功能的组件的内容封装在ComponentName类中;再通过调用Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。其中,ComponentName类能够将Android组件的信息封装起来,用于定义可见该组件;Intent方法用于实现Android组件之间的通信。并且,当实现特定功能的组件为Service组件时,图1所示方法的步骤S150启动可用进程,使得可用进程对应的同类型组件在该进程中运行是指:通过调用context.startService方法启动可用进程,使得可用进程对应的Service组件在该进程中运行。
具体地,上述将BarcodeService组件的内容传递到所找到的loader1进程对应的Service1组件中的过程是:将BarcodeService组件的内容封装在ComponentName类中,通过调用Intent方法将该封装好的ComponentName类传递给Service1组件,使得Service1组件具有了实现条形码功能的组件的内容;再通过调用context.startService方法启动loader1进程,使得Service1组件在loader1进程中运行,即可以实现插件所需的条形码功能。
考虑到在Android系统中进行实例化操作之前需要加载该实例化对象的Class对象,因此,在本发明的一个实施例中,图1所示方法的步骤S150在启动可用进程之前,进一步包括:获取并加载实现特定功能的组件的Class对象。该过程包括:从插件的配置文件中获取实现特定功能的组件的内容;自定义ClassLoader方法;由该自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
具体地,在上述启动loader1进程之前,上文中的例子进一步包括:从插件的AndroidManifest.xml文件中获取BarcodeService组件的内容;自定义ClassLoader方法替换Android系统标准的ClassLoader方法,重新定义ClassLoader方法中的findClass方法,该findClass方法可以根据BarcodeService组件的内容执行invoke方法获取到该BarcodeService组件的Class对象,自定义ClassLoader方法加载该Class对象,为后续进程的启动做好准备。
在本发明的一个实施例中,图1所示的方法还进一步在Android程序的配置文件中实时记录更新该Android程序的各进程的进程信息,包括预留组件对应的进程的进程信息,也包括其他正常创建的进程的进程信息。其中,进程信息包括以下信息中的一个或多个:
(1)进程编号:为附在进程名中的编号,如上例中,进程loader0的编号为0,进程loader1的编号为1,以此类推。
(2)进程状态:按照一个进程的生命周期来看,包括未分配状态、已分配未启动状态、启动状态、暂停状态和停止状态;当系统启动时,会通过Application.attachBaseContext方法初始化各进程的上述信息,进程的进程状态为未分配状态;当一个进程被分配给运行对象时,会通过Application.onCreate方法初始化该进程的其他信息,并将进程状态设置为已分配未启动状态。
(3)进程启动/修改状态的时间。
(4)进程对应的组件名:进程中运行的组件名。
(5)进程的ID标识:是各进程的身份标识,进程一启动系统就会自动分配给进程一个独一无二的ID,进程停止后ID被系统回收,Android系统中一般不会把已经回收的进程ID重新分配给新的进程,新产生的ID一般比之前的大。
(6)进程中运行各组件的数量:包括进程中运行Activity组件的数量、进程中运行Service组件的数量、进程中运行ContentProvider组件的数量和进程中运行Service-Binder的数量等;例如,在进程中创建一个Service,需要在调用Service.onCreate方法时修改进程信息,将表示进程中运行Service的数量的变量加1;在进程中销毁一个Service,需要在调用Service.onDestroy方法时修改进程信息,将表示进程中运行Service的数量的变量减1;Service绑定或解绑时,类似,将表示进程中运行Service-Binder的数量的变量加1或减1;依次类推。
在Android程序的配置文件记录上述信息的基础上,在本发明的一个实施例中,当一个Android程序中的插件需要运行实现特定功能的组件时,图1所示方法的步骤S130在从预留的组件所声明的进程中找到一个可用进程之前,进一步包括:遍历Android程序的所有进程(ALL对象),根据各进程的进程信息,根据实现特定功能的组件的内容,判断是否存在已分配给实现特定功能的组件的进程;是则,直接令实现特定功能的组件在该进程中运行,不再执行从预留的组件所声明的进程中找到一个可用进程的操作。其中,根据各进程的进程信息,判断是否存在已分配给实现特定功能的组件的进程可以是:如果一个进程对应的组件名与该实现特定功能的组件的组件名相同,则无需再分配,直接令实现特定功能的组件在该进程中运行。
其中,本文中所述的插件的来源可以是:云端服务器中预存有与Android程序适配的多个插件信息的插件列表。此外,云端服务器还预先收集了各种可能出现的操作系统特征信息以及对应的插件信息,以便于通过将操作系统平台信息与这些预先收集的特征信息进行匹配比较,找到与操作系统平台信息匹配的特征信息,与所述特征信息对应的插件即为适合当前操作系统的插件。随后,获得所述操作系统适配的插件之后,服务器可以将插件下载地址返回给插件加载系统。例如,服务器可以返回插件的配置结构,其中包括了URL节点,该URL节点即为该插件的下载地址。
如果所有预留的组件所声明的进程中不存在已分配给实现特定功能的组件的进程,则继续从预留的组件所声明的进程中找到一个可用进程。在本发明的一个实施例中,图1所示方法的步骤S130从预留的组件所声明的进程中找到一个可用进程包括:遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;如果存在一个闲置进程,则将该闲置进程作为可用进程;如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程。
图2示出了根据本发明一个实施例的一种判断是否存在闲置进程的方法的流程图,该流程图将详细说明上述的遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程的过程。如图2所示,该方法包括:
步骤S210,遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则执行步骤S220,否则执行步骤S230。
本步骤中,处于未启动状态的进程包括处于未分配状态和已分配未启动状态的进程,是优先级最低的进程,因此该进程可以作为闲置进程。
步骤S220,强制回收该进程,重新创建该进程作为闲置进程。
本步骤的目的是确保进程内部纯净,如果不回收进程就启动的话,可能进程中还依然残留之前的运行对象,可能会出现各种意料不到的问题,如Resource Manager(资源管理)冲突等。
步骤S230,判断是否存在处于停止状态的进程,是则执行步骤S220,否则执行步骤S240。
本步骤中,如果进程处于停止状态,可判断该进程中的运行对象已停止运行,因此该进程可以作为闲置进程。
步骤S240,判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则执行步骤S220,否则执行步骤S250。
本步骤中,如果进程处于暂停状态且距离上次启动已超过指定时间,可判断由于某些原因,该进程中的运行对象不再运行了,因此该进程可以作为闲置进程。
步骤S250,判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvider组件和Binder组件均已超过指定时间的进程,是则执行步骤S220,否则执行步骤S260。
本步骤中,虽然进程处于启动状态,但如果其中的三大组件均已停止运行超过指定时间,可判断该进程中的运行对象不很重要。该进程的优先级较低,因此可以作为闲置进程。
步骤S260,强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为闲置进程。
本步骤中,经过上述判断过程,获知所有进程都处于运行状态,按照进程的生命周期来推测,最早启动的预留的进程最有可能接近停止状态,因此强制回收最早启动的预留的进程,重新创建该进程作为闲置进程。
可见,图2所示的方法根据进程状态和进程中运行的组件的类别来判断进程的优先级,找到当前情境下优先级最低的进程,强制回收并重新创建该进程作为闲置进程。
本文中,插件的来源可以是:云端服务器中预存有与Android程序适配的多个插件版本的插件列表,云端服务器还预先收集了各种可能出现的操作系统特征信息以及对应的插件版本,以便于通过将操作系统平台信息与这些预先收集的特征信息进行匹配比较,找到与操作系统平台信息匹配的特征信息,与所述特征信息对应的插件即为适合当前操作系统的插件。此时,当本地客户端向云端服务器发送插件获取请求,接着接收云端服务器根据插件列表返回的、与Android程序适配的插件版本。进一步,在获得所述操作系统适配的插件之后,云端服务器可以将插件下载地址返回给插件加载系统。例如,服务器可以返回插件的配置结构,其中包括了URL节点,该URL节点即为该插件的下载地址。此外,云端服务器还将插件名、插件的各插件版本所能使用的最低接口版本和最高接口版本返回给插件加载系统,以便用于后续的加载工作。
图3示出了根据本发明一个实施例的一种Android程序中的组件管理装置的示意图。如图3所示,该Android程序中的组件管理装置300包括:
配置单元310,适于在Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程;以及适于在Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容。
查找单元320,适于当插件需要运行实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程。
启动单元330,适于将实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中;以及适于启动可用进程,使得可用进程对应的同类型组件在该进程中运行。
可见,图3所示的装置通过各单元的相互配合,对Android程序的配置文件的预先设置,预留一个或多个组件,并为预留的每个组件声明一个进程,当插件需要运行实现特定功能的组件时,无需重新配置Android程序,直接从预留的组件所声明的进程中找到一个可用进程,将实现特定功能的组件的内容传递给可用进程对应的同类型组件中,该同类型组件在可用进程中的运行即完成了插件中实现特定功能的组件的运行,实现了在Android主程序不升级的前提下,插件对组件的自由定制,由于主程序无需升级,而所扩展的活动组件又便于被打包处理成插件功能模块,因此,每次进行升级时,只需下载相应的插件功能模块即可。这就真正做到了最小化安装,大大节省流量,又不需大量消耗终端的资源,既省流量又能高效运行,使得Android程序的功能扩展更加便捷化、高效化、符合应用需求。
在本发明的一个实施例中,图3所示装置的配置单元310适于利用Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程;和/或,利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程。对应地,配置单元310适于利用所述Android程序的插件的AndroidManifest.xml文件中的<service>标签声明该插件所要使用的实现特定功能的Service组件的内容;和/或,利用所述Android程序的插件的AndroidManifest.xml文件中的<provider>标签声明该插件所要使用的实现特定功能的ContentProvider组件的内容。具体的实施例在上文中已详细说明,在此不再赘述。
在本发明的一个实施例中,图3所示装置的配置单元310还进一步适于在Android程序的配置文件中实时记录更新该Android程序的各进程的进程信息,包括预留组件对应的进程的进程信息,也包括其他正常创建的进程的进程信息。其中,进程信息包括以下信息中的一个或多个:进程编号、进程状态、进程启动/修改状态的时间、进程对应的组件名、进程的ID标识和进程中运行各组件的数量,各信息的含义在上文中已详细说明,在此不再赘述。
在Android程序的配置文件记录上述信息的基础上,在本发明的一个实施例中,当一个Android程序中的插件需要运行实现特定功能的组件时,图3所示装置的查找单元320在从预留的组件所声明的进程中找到一个可用进程之前,进一步适于遍历Android程序的所有进程,根据各进程的进程信息,判断是否存在已分配给实现特定功能的组件的进程;是则,直接通知启动单元330,不再执行从预留的组件所声明的进程中找到一个可用进程的操作;启动单元330,适于令实现特定功能的组件在该进程中运行。其中,查找单元320根据各进程的进程信息,判断是否存在已分配给实现特定功能的组件的进程可以是:如果一个进程对应的组件名与该实现特定功能的组件的组件名相同,则无需再分配,直接令实现特定功能的组件在该进程中运行。
如果所有预留的组件所声明的进程中不存在已分配给实现特定功能的组件的进程,则继续从预留的组件所声明的进程中找到一个可用进程。在本发明的一个实施例中,图3所示装置的查找单元320适于遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;如果存在一个闲置进程,则将该闲置进程作为可用进程;如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程;进一步地,查找单元320,适于当不存在闲置进程时,强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为可用进程。
其中,查找单元320适于遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程的过程具体为:查找单元320,适于遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于停止状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvider组件和Binder组件均已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程。
可见,查找单元320根据进程状态和进程中运行的组件的类别来判断进程的重要性,找到当前情境下最不重要的进程,强制回收并重新创建该进程作为闲置进程。
在本发明的一个实施例中,图3所示装置的启动单元330适于先将所述实现特定功能的组件的内容封装在ComponentName类中;再通过调用Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。并且,当实现特定功能的组件为Service组件时,启动单元330适于通过调用context.startService方法启动可用进程,使得可用进程对应的Service组件在该进程中运行。
考虑到在Android系统中进行实例化操作之前需要加载该实例化对象的Class对象,因此,在本发明的一个实施例中,图3所示装置的启动单元330在启动可用进程之前,进一步适于获取并加载实现特定功能的组件的Class对象。该过程包括:启动单元330从插件的配置文件中获取实现特定功能的组件的内容;自定义ClassLoader方法;由该自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
综上所述,本发明提供的技术方案通过对Android程序的配置文件的预先设置,预留一个或多个组件,并为预留的每个组件声明一个进程,当插件需要运行实现特定功能的组件时,无需重新配置Android程序,直接从预留的组件所声明的进程中找到一个可用进程,将实现特定功能的组件的内容传递给可用进程对应的同类型组件中,该同类型组件在可用进程中的运行即完成了插件中实现特定功能的组件的运行,实现了在Android主程序不升级的前提下,插件对组件的自由定制,由于主程序无需升级,而所扩展的活动组件又便于被打包处理成插件功能模块,因此,每次进行升级时,只需下载相应的插件功能模块即可。这就真正做到了最小化安装,大大节省流量,又不需大量消耗终端的资源,既省流量又能高效运行,使得Android程序的功能扩展更加便捷化、高效化、符合应用需求,对于Android开发的进一步发展具有重要的意义;并且,本发明使得插件功能模块可以标准化实现,由此便可以简化应用分发系统的云端实现,有利于不同应用程序之间的资源共享。不同应用程序之间只要构建了实施本发明的架构,即可通过下载一些共通的插件功能模块来实现同一的功能,显然大大减轻了开发者的劳动,也简化了服务器的程序资源的复杂度。
需要说明的是:
在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的一种Android程序中的组件管理装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明公开了A1、一种Android程序中的组件管理方法,其中,该方法包括:
在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程;
在所述Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容;
当所述插件需要运行所述实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程;
将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中;
启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行。
A2、如A1所述的方法,其中,在所述启动所述可用进程之前,该方法进一步包括:
获取并加载所述实现特定功能的组件的Class对象。
A3、如A2所述的方法,其中,所述获取并加载所述实现特定功能的组件的Class对象是指:
从所述插件的配置文件中获取所述实现特定功能的组件的内容;
自定义ClassLoader方法;
由所述自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
A4、如A1所述的方法,其中,所述在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程包括:
利用所述Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程;
和/或,
利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程。
A5、如A1所述的方法,其中,所述将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中是指:
将所述实现特定功能的组件的内容封装在ComponentName类中;
通过Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。
A6、如A5所述的方法,其中,当所述实现特定功能的组件为Service组件时,所述启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行是指:
通过context.startService方法启动所述可用进程,使得所述可用进程对应的Service组件在该进程中运行。
A7、如A1所述的方法,其中,该方法进一步包括:
在所述Android程序的配置文件中实时记录更新所述Android程序的各进程的进程信息。
A8、如A7所述的方法,其中,所述进程信息包括以下信息中的一个或多个:
进程编号、进程状态、进程启动/修改状态的时间、进程对应的组件名、进程的ID标识、进程中运行各组件的数量。
A9、如A8所述的方法,其中,在所述从预留的组件所声明的进程中找到一个可用进程之前,该方法进一步包括:
遍历所述Android程序的所有进程,根据各进程的进程信息,判断是否存在已分配给所述实现特定功能的组件的进程;
是则,直接令所述实现特定功能的组件在该进程中运行,不再执行所述从预留的组件所声明的进程中找到一个可用进程的操作。
A10、如A9所述的方法,其中,所述从预留的组件所声明的进程中找到一个可用进程包括:
遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;
如果存在一个闲置进程,则将该闲置进程作为可用进程;
如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程。
A11、如A10所述的方法,其中,所述从预留的组件所声明的进程中找到一个可用进程进一步包括:
如果不存在闲置进程,则强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为可用进程。
A12、如A10所述的方法,其中,所述遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程包括:
遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于停止状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;
否则判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvider组件和Binder组件均已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程。
本发明还公开了B13、一种Android程序中的组件管理装置,其中,该装置包括:
配置单元,适于在所述Android程序的配置文件中预留一个或多个组件,为预留的每个组件声明一个进程;以及适于在所述Android程序的插件的配置文件中声明该插件要使用的实现特定功能的组件的内容;
查找单元,适于当所述插件需要运行所述实现特定功能的组件时,从预留的组件所声明的进程中找到一个可用进程;
启动单元,适于将所述实现特定功能的组件的内容传递到所找到的可用进程对应的同类型组件中;以及适于启动所述可用进程,使得所述可用进程对应的同类型组件在该进程中运行。
B14、如B13所述的装置,其中,
所述启动单元,进一步适于获取并加载所述实现特定功能的组件的Class对象。
B15、如B14所述的装置,其中,
所述启动单元,适于从所述插件的配置文件中获取所述实现特定功能的组件的内容;以及适于自定义ClassLoader方法;由所述自定义ClassLoader方法根据所述实现特定功能的组件的内容获取并加载所述实现特定功能的组件的Class对象。
B16、如B13所述的装置,其中,
所述配置单元,适于利用所述Android程序的AndroidManifest.xml文件中的<service>标签预留一个或多个Service组件,为预留的每个Service组件声明一个进程;和/或,适于利用所述Android程序的AndroidManifest.xml文件中的<provider>标签预留一个或多个ContentProvider组件,为预留的每个ContentProvider组件声明一个进程。
B17、如B13所述的装置,其中,
所述启动单元,适于将所述实现特定功能的组件的内容封装在ComponentName类中;再通过Intent方法将该ComponentName类传递到所找到的可用进程对应的同类型组件中。
B18、如B17所述的装置,其中,当所述实现特定功能的组件为Service组件时,
所述启动单元,适于通过context.startService方法启动所述可用进程,使得所述可用进程对应的Service组件在该进程中运行。
B19、如B13所述的装置,其中,
所述配置单元,进一步适于在所述Android程序的配置文件中实时记录更新所述Android程序的各进程的进程信息。
B20、如B19所述的装置,其中,所述进程信息包括以下信息中的一个或多个:
进程编号、进程状态、进程启动/修改状态的时间、进程对应的组件名、进程的ID标识、进程中运行各组件的数量。
B21、如B20所述的装置,其中,
所述查找单元,进一步适于遍历所述Android程序的所有进程,根据各进程的进程信息,判断是否存在已分配给所述实现特定功能的组件的进程;是则,直接通知所述启动单元,不再执行所述从预留的组件所声明的进程中找到一个可用进程的操作;
所述启动单元,适于令所述实现特定功能的组件在该进程中运行。
B22、如B21所述的装置,其中,
所述查找单元,适于遍历所有预留的组件所声明的进程,根据各进程的进程信息,判断是否存在闲置进程;如果存在一个闲置进程,则将该闲置进程作为可用进程;如果存在多个闲置进程,则选择其中最早启动的进程作为可用进程。
B23、如B22所述的装置,其中,
所述查找单元,进一步适于当不存在闲置进程时,强制回收最早启动的预留的组件所声明的进程,重新创建该进程作为可用进程。
B24、如B22所述的装置,其中,
所述查找单元,适于遍历所有预留的组件所声明的进程,判断是否存在处于未启动状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于停止状态的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于暂停状态且距离上次启动已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程;否则判断是否存在处于启动状态且距离上次使用Activity组件、Service组件、ContentProvider组件和Binder组件均已超过指定时间的进程,是则强制回收该进程,重新创建该进程作为所述闲置进程。