CN108279939B - 一种Android插件框架支持新增广播接收者的方法、装置及设备 - Google Patents
一种Android插件框架支持新增广播接收者的方法、装置及设备 Download PDFInfo
- Publication number
- CN108279939B CN108279939B CN201611257076.8A CN201611257076A CN108279939B CN 108279939 B CN108279939 B CN 108279939B CN 201611257076 A CN201611257076 A CN 201611257076A CN 108279939 B CN108279939 B CN 108279939B
- Authority
- CN
- China
- Prior art keywords
- broadcast receiver
- plug
- broadcast
- target
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
- G06F9/44526—Plug-ins; Add-ons
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种Android插件框架支持新增广播接收者的方法及装置,以及一种电子设备。所述Android插件框架支持新增广播接收者的方法包括:当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。采用上述方法,解决现有的插件框架在支持新增广播接收者的方案存在程序执行效率低、影响广播的正常使用及影响系统性能等问题。
Description
技术领域
本申请涉及Android系统插件化技术领域,具体涉及一种Android插件框架支持新增广播接收者的方法及装置。
背景技术
广播接收者(BroadcastReceiver)是Android系统上标准四大组件之一,本质是一种全局的监听器,它可以非常方便地实现系统不同组件之间的通信。在Android系统插件化技术领域,插件包新增广播接收者作为插件内部、插件之间通信的标准系统组件,应用场景非常普遍。
现有的插件框架支持新增广播接收者的方案,首先预先在主APK占位声明;然后将静态注册广播接收者转换为动态注册广播接收者。其中,360DroidPlugin将静态广播转换动态广播方案的步骤如下:首先,解析插件apk配置文件,获取所有广播列表;然后,在插件apk安装阶段,应用创建之后,遍历广播列表,通过反射构造广播接收者,连同IntentFilter一起,向系统动态注册广播接收者。广播接收者就能正常执行了。
现有的插件框架在支持新增广播接收者的方案存在以下缺陷:
1.所有插件内部广播接收者,全部当作新增广播接收者处理,静态注册转为动态注册,程序执行效率低。
2.新增广播接收者所在插件没有安装运行时,广播接收者永远不会被触发,严重影响广播的正常使用。
3.一旦系统动态注册广播接收者,在应用整个生命周期内,将一直在内存里面,不会释放,影响系统性能。
综上所述,现有的插件框架在支持新增广播接收者的方案存在程序执行效率低、影响广播的正常使用及影响系统性能等缺陷。
发明内容
本申请提供一种Android插件框架支持新增广播接收者的方法,以解决现有的插件框架在支持新增广播接收者的方案存在程序执行效率低、影响广播的正常使用及影响系统性能等问题。
所述Android插件框架支持新增广播接收者的方法包括:
当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;
遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
可选的,所述拦截待分发的广播消息,包括:
在ActivityManagerNative的实现内拦截所述广播消息或在ContextImpl类的实现内拦截所述广播消息。
可选的,所述获取插件升级操作导致的接收所述广播消息的目标广播接收者列表,包括:
判断是否有插件升级,若是,获取升级插件;
针对每个升级插件,解析所述升级插件包配置文件Manifest,获取广播接收者列表;
从所述广播接收者列表获取新增广播接收者列表;
通过匹配操作获取需要接收所述广播消息的目标广播接收者列表。
可选的,所述从所述广播接收者列表获取新增广播接收者列表,包括:
通过系统服务PackageManagerService检测来获取所述广播接收者列表中的新增广播接收者列表。
可选的,所述通过匹配操作获取需要接收所述广播消息的目标广播接收者列表的步骤如下:
解析新增广播接收者列表中的每个新增广播接收者的IntentFilter,生成过滤器;
通过过滤器循环遍历,获取匹配成功的所述目标广播接收者列表。
可选的,所述运行目标广播接收者对应的升级插件针对所述广播消息的处理函数,包括:
通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法。
可选的,所述通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法,包括:
将匹配到的目标广播接收者按照所在升级插件构成一个Map,Key为升级插件名称,value为所述升级插件对应的目标广播接收者列表;
遍历所述Map,根据所述升级插件名称启动对应的升级插件;
针对所述升级插件对应的每个目标广播接收者,使用对应插件类加载器反射构造目标广播接收者并执行所述目标广播接收者对应的升级插件针对所述广播消息的onReceive方法。
可选的,所述运行目标广播接收者对应的升级插件针对所述广播消息的处理函数,具体为:
向系统动态注册广播接收者,由系统执行其onReceive方法。
本申请还提供一种Android插件框架支持新增广播接收者的装置,所述装置包括:
获取单元,用于当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;
启动单元,用于遍历从获取单元中获取的所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行单元,用于运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
本申请还提供一种电子设备,该电子设备支持Android系统,包括:
处理器;以及
存储器,用于存储一种Android插件框架支持新增广播接收者的程序,该设备通电并通过所述处理器运行所述Android插件框架支持新增广播接收者的程序后,执行下述步骤:
当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;
遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。与现有技术相比,本申请具有以下优点:
本申请提供一种Android插件框架支持新增广播接收者的方法,包括:当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
本申请提供的Android插件框架支持新增广播接收者的方法,当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表,只有插件升级时,才执行新增广播接收者拦截代理逻辑,执行效率更高;无论新增目标广播接收者所在的插件是否安装运行,都可以通过运行新增目标广播接收者对应的升级插件针对所述广播消息的处理函数,完美支持新增目标广播接收者正常运行;广播接收者运行完了之后,就会释放,不影响性能。
附图说明
图1是本申请第一实施例提供的一种Android插件框架支持新增广播接收者的方法的流程图。
图2是本申请第一实施例中提供的获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表的流程图。
图3是本申请第二实施例提供的一种Android插件框架支持新增广播接收者的装置的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是,本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请第一实施例提供了Android插件框架支持新增广播接收者的方法。请参考图1,其示出了根据本申请的实施例提供的Android插件框架支持新增广播接收者的方法的流程图。以下结合图1进行详细说明。
步骤S101,当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表。
本步骤在拦截到待分发的广播消息时,将插件升级导致的新增的能够接收所述广播消息的目标广播接收者找到,为启动目标广播接收者做好了准备。
所述消息(Intent),是Android提供的用来协助应用间交互与通讯的机制,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service/BroadcastReceiver之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”,专门提供组件互相调用的相关信息。
所述广播消息(Broadcast Intent),指Android系统与系统的事件相关的广播Intent,比如网络连接、底座模式的状态、电话接听状态等。当广播消息被传递出后,系统会找到合适的广播接收者去响应广播消息。
所述拦截待分发的广播消息,可以通过拦截代理系统AMS与Activity Thread通信ActivityManagerNative类的对象,将BroadcastIntent方法复写。所述复写BroadcastIntent方法,是指将步骤S101、步骤S102、步骤S103中的内容所对应的代码插入到BroadcastIntent方法的实现中。当待分发的广播消息在分发过程中,会进入到BroadcastIntent方法,即广播消息发出后,BroadcastIntent方法被触发,在BroadcastIntent方法内插入一段代码,实现了对待分发的广播消息的拦截。
所述拦截待分发的广播消息,还可以通过拦截ContextImpl这个类的实现,在广播消息的分发过程的开始进行拦截。具体的,可以通过在sendBroadcast(Intent intent){}内并在调用BroadcastIntent方法之前插入上述代码。
通过拦截待分发的广播消息,在广播消息的分发过程中将新增的广播接收者运行起来,实现了动态拦截Android Framework底层启动广播接收者的过程,将系统广播改用类似本地广播机制执行,从而保证了插件内、插件间正常通信。
所述插件(Plugin)是一种遵循一定规范的应用程序接口编写出来的程序。其只能运行在程序规定的系统平台下(可能同时支持多个平台),而不能脱离指定的平台单独运行。
插件升级时,插件在原有的功能上增加了新的功能或做了某些程序上的改进。例如,在插件的程序中增加了一个广播接收者来接收某个广播消息,就是将插件进行了升级操作。
所述广播接收者,是Android四大基本组件之一,这种组件本质上是一种全局的监听器,用于监听系统全局的广播消息。它可以接收来自系统和应用的广播。比如,可以发出一种广播来测试手机电量的变化,这时候就可以定义一个BraodcastReceiver来接受广播,当手机电量较低时提示用户。
所述目标广播接收者,是插件升级时新增的能够接收所述广播消息的广播接收者。例如,一个购物类的Android应用对商品进行操作收藏或取消时会发出广播消息,有个升级插件1需要及时同步商品收藏状态,则需要注册一个接收收藏或取消消息的广播接收者A,则升级插件1注册的广播接收者A就是目标广播接收者。
所述基于插件升级操作引入的接收所述广播消息的目标广播接收者列表,指所有基于插件升级操作引入的新增的能够接收所述广播消息的广播接收者。
例如,一个Android应用在耳机插/拔时会发出广播消息,插件1、插件2、插件3都进行了升级,分别新增注册了一个接收耳机插/拔消息的广播接收者A、广播接收者B、广播接收者C,则广播接收者A、广播接收者B和广播接收者C就构成了目标广播接收者列表。
需要说明的是,一个插件中还可以注册多个目标广播接收者接收同一个广播消息。例如,一个Android应用在耳机插/拔时会发出广播消息,插件4可以新注册两个能接收耳机插/拔消息的广播接收者A和广播接收者B。
所述获取插件升级操作导致的接收所述广播消息的目标广播接收者列表,其具体可采用以下实现过程:
判断是否有插件升级,若是,获取升级插件;
针对每个升级插件,解析所述升级插件包配置文件Manifest,获取广播接收者列表;
从所述广播接收者列表获取新增广播接收者列表;
通过匹配操作获取需要接收所述广播消息的目标广播接收者列表。
请参见图2,其为本申请的第一实施例提供的获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表的流程图,具体包括步骤S101-1至S101-5。
步骤S101-1,判断是否有插件升级,若是,则执行步骤S101-2。
本实施例中,判断是否有插件升级,其具体过程为:插件升级由插件框架处理,插件框架定期从服务端获取数据检测是否有升级包,当获取到插件升级数据时,进行插件升级安装,安装之后就会在被升级插件目录做一个标记,如果插件被作了此标记,则为升级插件。
步骤S101-2,获取升级插件。
根据步骤S102-1中升级插件目录中的标记,获取升级插件。例如:如果升级插件目录中对插件1、插件2、插件3作了标记,则获取到的升级插件有插件1、插件2、插件3。
步骤S101-3,针对每个升级插件,解析所述升级插件包配置文件Manifest,获取广播接收者列表。
在获取升级插件之后,解析每个升级插件包配置文件Manifest(AndroidManifest.xml文件),获取广播接收者列表。因为所有广播接收者都会在各自插件包配置文件Manifest中进行注册,所以可以通过解析每个升级插件包配置文件Manifest获取所有广播接收者列表。
AndroidManifest.xml是每个Android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。
例如,假设获取到的升级插件为插件1、插件2,通过解析升级插件包配置文件,获取到升级插件1对应的广播接收者为广播接收者A、广播接收者B、广播接收者C;升级插件2对应的广播接收者为广播接收者D、广播接收者E、广播接收者F。
步骤S101-4,从所述广播接收者列表获取新增广播接收者列表。
在解析所述升级插件的配置文件Manifest,获取广播接收者列表后,需要将新增的广播接收者检测出来。从所述广播接收者列表获取新增广播接收者列表,可以通过系统服务PackageManagerService检测来获取所述广播接收者列表中的新增广播接收者列表。
通过系统服务PackageManagerService检测来获取所述广播接收者列表中的新增广播接收者列表,其依据是:
如果不是新增的广播接收者,在打整包发布时已经被打入主APK的manifest中,整包安装时PackageManagerService会解析和记录配置文件Manifest中所有声明组件,在应用运行时,通过Intent发送一个广播消息时,PackageManagerService就能找到匹配的广播接收者,从而顺利接受到广播消息。
而插件升级时新增的广播接收者,因为没有被打入主APK的配置文件Manifest中,PackageManagerService就不知道新增的广播接收者的存在。根据这一特点,PackageManagerService可以根据广播接收者的类名构造一个显式Intent来探测一个广播接收者是否为新增广播接收者。
例如:
Intent testIntent=new Intent();
testIntent.setComponent(BroadcastReceiver类名);
),
使用PackageManagerService去查询,探测到上述类名的广播接收者没有响应,就确定是一个新增的广播接收者。
使用PackageManagerService检测方法对获取的广播接收者列表中的所有广播接收者遍历一遍,所有探测到的新增的广播接收者就构成了一个新增广播接收者列表。
步骤S101-5,通过匹配操作获取需要接收所述广播消息的目标广播接收者列表。
所述通过匹配操作获取需要接收所述广播消息的目标广播接收者列表的步骤如下:
解析新增广播接收者列表中的每个新增广播接收者的IntentFilter,生成过滤器;
通过过滤器循环遍历,获取匹配成功的所述目标广播接收者列表。
因为获取的新增广播接收者列表中的新增广播接收者不一定都能接收所述广播消息,所以需要进行新增广播接收者与所述广播消息之间的匹配操作,通过匹配操作找出能够接收所述广播消息的新增广播接收者,作为目标广播接收者列表。其中,目标广播接收者列表可能包含一个广播接收者,也可能包含多个广播接收者。
具体的,如果新增广播接收者的类型与所述广播消息的类型相同,认为匹配成功,则认为新增广播接收者是一个目标广播接收者。
所述广播接收者的IntentFilter,是广播接收者设置的一个或者多个Intent过滤器。每个过滤器描述了组件的一种能力,通过IntentFilter过滤掉广播接收者不接收的Intent,留下接收的Intent。
所述解析新增广播接收者的IntentFilter,生成过滤器,是指将新增广播接收者列表中每个广播接收者的IntentFilter解析出来,生成一个过滤器(参照系统类IntentResolver实现)。
所述通过过滤器循环遍历,得到匹配成功的所述目标广播接收者列表,指过滤器查询所述广播消息,将每个新增广播接收者与所述广播消息匹配,若匹配成功,则作为目标广播接收者,所有与所述广播消息匹配的目标广播接收者就构成目标广播接收者列表。
下面是一个详细介绍获取目标广播接收者列表的例子:
假设服务端一次推送了两个升级插件包升级(A和B)数据,且插件A和插件B均新增一个接受同一类型的广播消息(通过广播接收者设置的IntentFilter定义在Manifest中,类型假设为TypeC)的广播接收者a和广播接收者b。当插件A和B安装完成之后,插件框架标记插件A和B为升级状态。
当应用内部发出某个广播消息Intent时,代理ActivityManagerNative拦截到此消息,依次遍历升级插件A和B,进入匹配获取目标广播接收者列表的步骤:
首先,解析升级插件A的配置文件Manifest,获取插件A中所有定义的广播接收者列表;
然后,遍历广播接收者列表中每个广播接收者,以其类名称构造一个显式Intent,使用PackageManagerService去查询能响应此Intent的广播接收者,结果发现广播接收者a没有被查询出,确定广播接收者a就是一个新增广播接收者,将广播接收者a放入新增广播接收者列表中。遍历完成后,最终插件A的新增广播接收者列表形成,本例中只有广播接收者a。
然后,把新增广播接收者列表中每个广播接收者的IntentFilter解析出来,生成一个自定义过滤器(参照系统类IntentResolver实现)。
最后,自定义过滤器查询上述提及的广播消息Intent,假设该Intent消息类型是TypeC,则匹配成功,将新增的广播接收者a放入目标广播接收者列表中;如果该Intent消息类型不是TypeC,则匹配失败,不做任何处理交由系统执行其他逻辑。至此完成插件A的匹配。
然后,将插件B进行上述匹配过程,新增的广播接收者b放入目标广播接收者列表中。
最终,目标广播接收者列表中含有广播接收者a和广播接收者b。
步骤S102,遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件。
本步骤将目标广播接收者对应的升级插件进行启动,以保证升级插件的新功能能够正常运行。
所述遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件,可以在获取所述目标广播接收者列表后,将匹配到的目标广播接收者按照所在升级插件构成一个Map,Key为升级插件名称,value为所述升级插件对应的目标广播接收者列表,然后通过遍历MAP的key启动升级插件。
步骤S103,运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
本步骤是为了将新增的目标广播接收者能够及时地接收到所述广播消息。
所述运行目标广播接收者对应的升级插件针对所述广播消息的处理函数,具体可包括:
通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法。
使用如下方法反射构造所述目标广播接收者:
Classloader.loadClass(BroadcastReceiver名称).newInstance();
在反射构造所述目标广播接收者后,就可执行其onReceive方法。
所述通过插件类加载器反射构造广播接收者,执行其onReceive方法,包括:
将匹配到的目标广播接收者按照所在升级插件构成一个Map,Key为升级插件名称,value为所述升级插件对应的目标广播接收者列表;
遍历所述Map,根据所述升级插件名称启动对应的升级插件;
针对所述升级插件对应的每个目标广播接收者,使用对应插件类加载器反射构造目标广播接收者并执行所述目标广播接收者对应的升级插件针对所述广播消息的onReceive方法。
除了上述通过反射构造目标广播接收者并执行onReceive的方法外,实现运行目标广播接收者对应的升级插件针对所述广播消息的处理函数的目的,还可以通过向系统动态注册广播接收者,使用registerReceiver方法,由系统执行其onReceive方法。
通过上述使新增广播接收者运行的方法,实现了新增广播接收者的正常运行,新增广播接收者在收到广播消息后,升级的插件就能根据广播接收者收到的广播消息作出及时地响应。
与上述Android插件框架支持新增广播接收者的方法相对应的,本申请还提供了一种Android插件框架支持新增广播接收者的装置。由于所述装置的实施例基本相似于方法的实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。所述Android插件框架支持新增广播接收者的装置实施例如下:
请参考图3,其示出了根据本申请的第二实施例提供的一种Android插件框架支持新增广播接收者的装置的示意图。
所述Android插件框架支持新增广播接收者的装置,包括:获取单元301、启动单元302、运行单元303。
获取单元301,用于当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;
启动单元302,用于遍历从获取单元中获取的所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行单元303,用于运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
可选的,所述获取单元中的拦截带分发的广播消息,包括:
拦截ActivityManagerNative子单元,用于在ActivityManagerNative的实现内拦截广播消息;或
拦截ContextImpl子单元,用于在ContextImpl类的实现内拦截广播消息。
可选的,所述获取单元,包括:
获取子单元,用于判断是否有插件升级,若是,获取升级插件;
获取广播接收者列表子单元,用于针对每个升级插件,解析所述升级插件包配置文件Manifest,获取广播接收者列表;
获取新增列表子单元,用于从所述广播接收者列表获取新增广播接收者列表;
获取目标列表子单元,用于通过匹配操作获取需要接收所述广播消息的目标广播接收者列表。
可选的,所述获取新增列表子单元,包括:
检测子单元,用于通过系统服务PackageManagerService检测来获取所述广播接收者列表中的新增广播接收者列表。
可选的,所述获取目标列表子单元,包括:
解析子单元,用于解析新增广播接收者列表中的每个新增广播接收者的IntentFilter,生成过滤器;
获取子单元,用于通过过滤器循环遍历,获取匹配成功的所述目标广播接收者列表。
可选的,所述运行单元,包括:
运行子单元,用于通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法。
可选的,所述运行子单元,包括:
构造Map子单元,将匹配到的目标广播接收者按照所在升级插件构成一个Map,Key为升级插件名称,value为所述升级插件对应的目标广播接收者列表;
启动插件子单元,用于遍历所述Map,根据升级插件名称启动对应的升级插件;
构造接收者和执行方法子单元,用于针对所述升级插件对应的每个目标广播接收者,使用对应插件类加载器反射构造目标广播接收者并执行所述目标广播接收者对应的升级插件针对所述广播消息的onReceive方法。
可选的,所述运行单元,包括:
运行子单元,用于向系统动态注册广播接收者,由系统执行其onReceive方法。
本申请第三实施例提供一种电子设备,该电子设备支持Android系统,包括:
处理器;以及
存储器,用于存储一种Android插件框架支持新增广播接收者的程序,该设备通电并通过所述处理器运行所述Android插件框架支持新增广播接收者的程序后,执行下述步骤:
当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;
遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
Claims (10)
1.一种Android插件框架支持新增广播接收者的方法,其特征在于,包括:
当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;所述目标广播接收者列表,包括所有基于插件升级操作引入的新增的能够接收所述广播消息的广播接收者;所述广播接收者是在插件升级操作时通过注册引入的;
遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
2.根据权利要求1所述的Android插件框架支持新增广播接收者的方法,其特征在于,在当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表步骤之前,还包括:拦截待分发的广播消息;
所述拦截待分发的广播消息,包括:
在ActivityManagerNative的实现内拦截所述广播消息或在ContextImpl类的实现内拦截所述广播消息。
3.根据权利要求1所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表,包括:
判断是否有插件升级,若是,获取升级插件;
针对每个升级插件,解析升级插件包配置文件Manifest,获取广播接收者列表;
从所述广播接收者列表获取新增广播接收者列表;
通过匹配操作获取需要接收所述广播消息的目标广播接收者列表。
4.根据权利要求3所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述从所述广播接收者列表获取新增广播接收者列表,包括:
通过系统服务PackageManagerService检测来获取所述广播接收者列表中的新增广播接收者列表。
5.根据权利要求3所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述通过匹配操作获取需要接收所述广播消息的目标广播接收者列表的步骤如下:
解析新增广播接收者列表中的每个新增广播接收者的IntentFilter,生成过滤器;
通过过滤器循环遍历,获取匹配成功的所述目标广播接收者列表。
6.根据权利要求1所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述运行目标广播接收者对应的升级插件针对所述广播消息的处理函数,包括:
通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法。
7.根据权利要求6所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述通过插件类加载器反射构造所述目标广播接收者,执行其onReceive方法,包括:
将匹配到的目标广播接收者按照所在升级插件构成一个Map,Key为升级插件名称,value为所述升级插件对应的目标广播接收者列表;
遍历所述Map,根据所述升级插件名称启动对应的升级插件;
针对所述升级插件对应的每个目标广播接收者,使用对应插件类加载器反射构造目标广播接收者并执行所述目标广播接收者对应的升级插件针对所述广播消息的onReceive方法。
8.根据权利要求1所述的Android插件框架支持新增广播接收者的方法,其特征在于,所述运行目标广播接收者对应的升级插件针对所述广播消息的处理函数,包括:
向系统动态注册广播接收者,由系统执行其onReceive方法。
9.一种Android插件框架支持新增广播接收者的装置,其特征在于,包括:
获取单元,用于当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;所述目标广播接收者列表,包括所有基于插件升级操作引入的新增的能够接收所述广播消息的广播接收者;所述广播接收者是在插件升级操作时通过注册引入的;启动单元,用于遍历从获取单元中获取的所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行单元,用于运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
10.一种电子设备,其特征在于,该电子设备支持Android系统,包括:
处理器;以及
存储器,用于存储一种Android插件框架支持新增广播接收者的程序,该设备通电并通过所述处理器运行所述Android插件框架支持新增广播接收者的程序后,执行下述步骤:
当拦截到待分发的广播消息时,获取基于插件升级操作引入的接收所述广播消息的目标广播接收者列表;所述目标广播接收者列表,包括所有基于插件升级操作引入的新增的能够接收所述广播消息的广播接收者;所述广播接收者是在插件升级操作时通过注册引入的;遍历所述目标广播接收者列表,启动目标广播接收者对应的升级插件;
运行所述目标广播接收者对应的升级插件针对所述广播消息的处理函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611257076.8A CN108279939B (zh) | 2016-12-30 | 2016-12-30 | 一种Android插件框架支持新增广播接收者的方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611257076.8A CN108279939B (zh) | 2016-12-30 | 2016-12-30 | 一种Android插件框架支持新增广播接收者的方法、装置及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108279939A CN108279939A (zh) | 2018-07-13 |
CN108279939B true CN108279939B (zh) | 2021-07-23 |
Family
ID=62800219
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611257076.8A Active CN108279939B (zh) | 2016-12-30 | 2016-12-30 | 一种Android插件框架支持新增广播接收者的方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108279939B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110515673B (zh) * | 2019-07-24 | 2022-10-11 | 百度在线网络技术(北京)有限公司 | 插件化系统及其方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103399792A (zh) * | 2013-07-24 | 2013-11-20 | 佳都新太科技股份有限公司 | 基于Android的应用插件化实现方案 |
CN103593217A (zh) * | 2013-11-26 | 2014-02-19 | 广东欧珀移动通信有限公司 | 一种调整耳机的hook键启动应用次序的方法及终端 |
CN104239054A (zh) * | 2014-09-12 | 2014-12-24 | 广州市久邦数码科技有限公司 | 一种基于安卓系统的插件加载方法及其系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130217333A1 (en) * | 2012-02-22 | 2013-08-22 | Qualcomm Incorporated | Determining rewards based on proximity of devices using short-range wireless broadcasts |
-
2016
- 2016-12-30 CN CN201611257076.8A patent/CN108279939B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103399792A (zh) * | 2013-07-24 | 2013-11-20 | 佳都新太科技股份有限公司 | 基于Android的应用插件化实现方案 |
CN103593217A (zh) * | 2013-11-26 | 2014-02-19 | 广东欧珀移动通信有限公司 | 一种调整耳机的hook键启动应用次序的方法及终端 |
CN104239054A (zh) * | 2014-09-12 | 2014-12-24 | 广州市久邦数码科技有限公司 | 一种基于安卓系统的插件加载方法及其系统 |
Non-Patent Citations (1)
Title |
---|
插件之广播管理;Warden032;《https://blog.csdn.net/warden032/article/details/51958228》;20160719;第1-11页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108279939A (zh) | 2018-07-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10834234B2 (en) | Automatic interdependency resolution for micro-service deployments | |
CN105335187B (zh) | 一种应用的处理方法及装置 | |
CN111078504A (zh) | 一种分布式调用链跟踪方法、装置、计算机设备及存储介质 | |
CN111443920B (zh) | 一种框架迁移方法及装置 | |
CN111124480B (zh) | 应用程序包的生成方法、装置、电子设备及存储介质 | |
US20150026658A1 (en) | Systems, Methods and Media for Dynamic Creation and Update of Activation Context for Component Object Model | |
WO2017101382A1 (zh) | 终端连接服务器的方法、终端及域名服务器 | |
CN112416612B (zh) | 服务调用方法、装置、计算机设备和可读存储介质 | |
CN111240892A (zh) | 数据备份方法及装置 | |
CN105447040B (zh) | 二进制文件管理、更新方法、装置以及系统 | |
CN104346195A (zh) | 软件安装方法和系统 | |
CN108279939B (zh) | 一种Android插件框架支持新增广播接收者的方法、装置及设备 | |
CN102929733B (zh) | 一种错误文件处理方法、装置和客户端设备 | |
CN111488286B (zh) | 一种Android模块独立开发的方法及装置 | |
CN108268369B (zh) | 测试数据获取方法及装置 | |
CN112860507A (zh) | 分布式链路跟踪系统采样率的控制方法和装置 | |
CN109756948B (zh) | 通过用户设备中的应用连接无线接入点的方法与设备 | |
EP3321796B1 (en) | Multi-platform interface framework | |
TW201128532A (en) | Loading and upgrade device of Java cluster application system code and method thereof | |
CN108228145A (zh) | 混合型应用程序的数据处理方法、系统及移动设备 | |
US8321844B2 (en) | Providing registration of a communication | |
CN116991449B (zh) | 内核子系统热升级方法、设备及存储介质 | |
CN110753070A (zh) | 数据通信方法、客户端、服务端以及数据通信系统 | |
CN111708691B (zh) | 一种基于安卓平台的Fingerprint自动适配方法与设备 | |
US10289691B2 (en) | Dynamic replication of networked files |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |