[0053] 为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0054] 本发明一种Alarm优化管理方法,如图1所示,包括步骤:
[0055] S100当有Alarm需要删除时,根据所述Alarm的标识,遍历所述定时器集合列表中的每个定时器集合的Alarm列表,判断是否存在Alarm与待删除的Alarm匹配,若是,进入步骤S200,否则结束操作;
[0056] S200记录所述定时器集合的标识,删除所述定时器集合中的匹配上的Alarm;
[0057] S300根据所述定时器集合中剩下的Alarm的起始到时时间值和最晚到时时间值,获得所述定时器集合的新起始到时时间值和新最晚到时时间值,判断所述定时器集合的新起始到时时间值是否与原起始到时时间值一致,若是,则结束操作;否则进入步骤S400;
[0058] S400保留所述定时器集合中剩余的Alarm,删除所述定时器集合,并将所述剩余的Alarm添加到定时器集合列表中的各定时器集合中。
[0059] 系统中的很多应用会用到很多定时器,大多数定时器对精确性要求并不严格,比如某个应用隔一段时间会连接一次网络,至于这个时间是五分钟还是十分钟应用都可以接受,应用在设置这类定时器时,会设置Alarm的起始到时时间when(如五分钟)和最晚到时时间maxWhen(如十分钟),底层系统为了省电,即避免时间相邻的Alarm过多的唤醒系统导致电能消耗太多,将有交集的这类Alarm归结到一个定时器集合中,计算定时器集合的start(起始到时时间)和end(最晚到时时间)值,当start到时时,即认为该定时器集合下的所有Alarm均到时了,所有的Alarm就可以根据自己的情况进行应用处理。
[0060] 系统有一个定时器集合列表,每个定时器集合下有一个Alarm列表,在进行Alarm删除时,首先通过Alarm的标识匹配定时器集合中的所有Alarm,如果匹配不上,则说明该Alarm不存在,操作结束。一旦匹配上了,则记录下该Alarm所在的定时器集合标识,并从该定时器集合中删除对应的Alarm。然后根据剩下的Alarm的起始到时时间和最晚到时时间确定该定时器集合的start(起始到时时间)值是否需要调整,如果不需要调整,则不需要进行后续的定时器集合列表的重构和Alarm的重新添加,结束操作即可,如果start值需要调整,则保留该定时器集合下的所有剩下的Alarm,从定时器集合列表中删除该定时器集合,然后将先前保留的Alarm添加到定时器集合列表中。这样最多只需要添加调整过的定时器集合中的Alarm,而不是重构整个定时器集合列表,再重新添加所有的Alarm,效率相对来要提高很多。
[0061] 本发明方法的第二实施例,如图2所示,在上述实施例的基础上,细叙了步骤S300的过程,具体的,本实施例包括步骤:
[0062] S100当有Alarm需要删除时,根据所述Alarm的标识,遍历所述定时器集合列表中的每个定时器集合的Alarm列表,判断是否存在Alarm与待删除的Alarm匹配,若是,进入步骤S200,否则结束操作;
[0063] S200记录所述定时器集合的标识,删除所述定时器集合中的匹配上的Alarm;
[0064] S310获取所述定时器集合剩下的Alarm各起始时间值和最晚到时时间值;
[0065] S320取所述剩下Alarm的最大的起始时间值为所述定时器集合的新起始时间值,取所述剩下Alarm的最小的最晚到时时间值为所述定时器集合的新的最晚到时时间值;
[0066] S330判断所述定时器集合的新的起始时间值是否与所述定时器集合原起始时间值一致?若是,则进入步骤S500;否则,进入步骤S400。
[0067] S400保留所述定时器集合中剩余的Alarm,删除所述定时器集合,并将所述剩余的Alarm添加到定时器集合列表中的各定时器集合中。
[0068] 删除Alarm时,定时器集合的start值和end值调整规则:剩下所有Alarm的起始到时时间when中最大的when值即为定时器集合新的start值,剩下所有Alarm的最晚到时时间maxWhen中最小的maxWhen值即为定时器集合新的end值。例如,如果一个定时器集合的start值为10;end值为50;如果删除了第一个Alarm后,剩下的Alarm的when中最大的是10,maxWhen最小的为50,即该定时器集合的start值和end值不需要调整;如果删除了第二个Alarm,剩下的Alarm中when中最大的是20,maxWhen最小的为60,则该定时器集合的start值则调整为20,end值仍为50。
[0069] 本发明方法的第三个实施例,如图3所示,包括步骤:
[0070] S100当有Alarm需要删除时,根据所述Alarm的标识,遍历所述定时器集合列表中的每个定时器集合的Alarm列表,判断是否存在Alarm与待删除的Alarm匹配,若是,进入步骤S200,否则结束操作;
[0071] S200记录所述定时器集合的标识,删除所述定时器集合中的匹配上的Alarm;
[0072] S300根据所述定时器集合中剩下的Alarm的起始到时时间值和最晚到时时间值,获得所述定时器集合的新起始到时时间值和新最晚到时时间值,判断所述定时器集合的新起始到时时间值是否与原起始到时时间值一致,若是,则结束操作;否则进入步骤S400;
[0073] S410构建待调整定时器集合标识列表,将所述定时器集合的标识添加到待调整定时器集合标识列表中;
[0074] S420删除所述待调整定时器集合标识列表中相同的定时器集合标识;
[0075] S430根据所述待调整定时器集合标识列表,按照所述定时器集合标识查找到对应的定时器集合;
[0076] S440保留所述定时器集合中的所有Alarm,删除所述定时器集合;
[0077] S450将所述保留的所有Alarm添加到所述定时器集合列表的定时器集合中。
[0078] 删除Alarm后,删除所述定时器集合以及将保留的Alarm重新添加的条件:只有定时器集合的start(起始到时时间)值发生变化时,才需要删除所述定时器集合以及将保留的Alarm重新添加。如果仅仅只是end(最晚到时时间)值发生变化,则不需要。
[0079] 本实施例通过建立一个待调整定时器集合标识列表,将删除了Alarm且start值发生变化的定时器集合的标识添加到该待调整定时器集合标识列表中。然后再根据该待调整定时器集合列表,找到对应的定时器集合,保留其中的所有Alarm,然后删除这个定时器集合。再将保留的所有Alarm添加到定时器集合列表中的各定时器集合中。如此这样的话,就不需重新推翻所有的定时器集合列表,只需要筛选一部分进行删除添加,而筛选出来的这部分定时器集合,已将其标识例如了待调整定时器集合标识列表中,便于后续的查找和操作,大大提高了工作效率。
[0080] 较佳的,在上述实施例的基础上,将步骤S450进行了细叙,如图4所示,所述步骤S400包括步骤:
[0081] S410构建待调整定时器集合标识列表,将所述定时器集合的标识添加到待调整定时器集合标识列表中;
[0082] S420删除所述待调整定时器集合标识列表中相同的定时器集合标识;
[0083] S430根据所述待调整定时器集合标识列表,按照所述定时器集合标识查找到对应的定时器集合;
[0084] S440保留所述定时器集合中的所有Alarm,删除所述定时器集合;
[0085] S451根据Alarm的添加规则,判断所述Alarm是否能添加到所述定时器集合列表的现有定时器集合中,若是,则进入步骤S452;否则,进入步骤S453;
[0086] S452将所述Alarm添加至所述定时器集合中;
[0087] S453根据所述Alarm的起始到时时间值与最晚到时时间值,建立一个新定时器集合,将所述Alarm添加至所述新定时器集合中,所述新定时器集合的起始到时时间即为所述Alarm的起始到时时间,所述新定时器集合的最晚到时时间即为所述Alarm的最晚到时时间;将所述新定时器集合添加至所述定时器集合列表中。
[0088] 根据剩下的所有Alarm重构定时器集合列表,如果Alarm不符合添加该定时器集合的添加规则,那么,就必须重新建立一个定时器集合,把这个Alam纳入该定时器集合中,该定时集合的起始到时时间和最晚到时时间与该Alarm一致,该定时器集合也会被列入定时器集合列表中;如果符合添加规则的话,则添加该Alarm到该定时器集合中,同时会更新该定时器集合中新的起始到时时间和最晚到时时间。
[0089] 较佳的,所述Alarm的添加规则为:当Alarm的起始到时时间值小于定时器集合的最晚到时时间值,且所述Alarm的最晚到时时间值大于所述定时器集合的起始到时时间值时,添加所述Alarm至所述定时器集合。
[0090] 较佳的,在上述任一实施例的基础上,均可增加步骤:
[0091] S450获取各定时器集合的起始到时时间值,将起始到时时间最先到达的定时器集合的起始到时时间设置到底层驱动。
[0092] 由于本发明中Alarm的管理,会涉及定时器集合中Alarm的添加和删除,且随着Alarm的添加和删除,相应的定时器集合的(以下简称Batch)中的起始到时时间(以下以start代替)和最晚到时时间(以下以end代替)值也会相应变化,下面举例说明添加或删除时,定时器集合的start值和end值的计算过程:
[0093] 系统中的很多应用会用到很多定时器,大多数定时器对精确性要求并不严格,比如某个应用隔一段时间会连接一次网络,至于这个时间是五分钟还是十分钟应用都可以接受,应用在设置这类定时器时,会设置Alarm的起始到时时间when(如五分钟)和最晚到时时间maxWhen(如十分钟),底层系统为了省电,即避免时间相邻的Alarm过多的唤醒系统导致电能消耗太多,将有交集的这类Alarm归结到一个Batch中,计算Batch的start和end值,将Batch的start值设置到底层驱动系统中,当start到时时,即认为该Batch下的所有Alarm均到时了,所有的Alarm就可以根据自己的情况进行应用处理。
[0094] 确定Alarm适合可以添加到哪个Batch中的规则:Alarm的起始到时时间when小于Batch的end值,同时,Alarm的最晚到时时间maxWhen大于Batch的start值。
[0095] Alarm添加到Batch后,Batch的start值和end值调整规则:如果Alarm的起始到时时间when大于Batch的start值,则Batch的新start值则为该Alarm的起始到时时间when;如果Alarm的最晚到时时间maxWhen小于Batch的end值,则Batch的新end值为该Alarm的最晚到时时间maxWhen。
[0096] 举例如下:
[0097] 应用设置了第一个Alarm:起始到时时间when1为10分钟,最晚到时时间maxWhen1为50分钟,系统从10到50这个区间到时均满足要求;
[0098] 由于此时是第一个Alarm,Batch的start值为when1(10),end值为maxWhen1(50)[0099] 应用设置了第二个Alarm:起始到时时间when2为5分钟,最晚到时时间maxWhen2为40分钟,系统从5到40这个区间到时均满足要求;
[0100] 此时起始到时时间when2(5)Batch的start(10),该Alarm可以添加到Batch中,同时调整Batch的start和end值:起始到时时间when2(5)不满足大于Batch的start(10),所以Batch的start值不需要调整,最晚到时时间maxWhen2(40)小于Batch的end(50),所以Batch的end值调整为maxWhen2(40),此时Batch的start仍然为10,end值则为40
[0101] 应用设置了第三个Alarm:起始到时时间when3为20分钟,最晚到时时间maxWhen3为60分钟,系统从20到60这个区间到时均满足要求;
[0102] 此时起始到时时间when3(20)Batch的start(10),该Alarm可以添加到Batch中,同时调整Batch的start和end值:起始到时时间when3(20)大于Batch的start(10),所以Batch的start值调整为when3(20),最晚到时时间maxWhen3(60)不满足小于Batch的end(40),所以Batch的end值不需要调整,此时Batch的start仍然为20,end值则为40。
[0103] 应用设置了第四个Alarm:起始到时时间when4为25分钟,最晚到时时间maxWhen4为35分钟,系统从25到35这个区间到时均满足要求;
[0104] 此时起始到时时间when4(25)Batch的start(20),该Alarm可以添加到Batch中,同时调整Batch的start和end值:起始到时时间when4(25)大于Batch的start(20),所以Batch的start值调整为when4(25),最晚到时时间maxWhen4(35)小于Batch的end(40),所以Batch的end值调整为maxWhen4(35),此时Batch的start为25,end值则为35
[0105] 通过上面的例子,实际上系统将四个Alarm综合成一个Batch,Batch的start值均处于四个Alarm的有效区间,这样只需要设置Batch的start值到底层驱动,当Batch的start值到时后,即认为四个Alarm均到到时了,设置了Alarm的应用就可以进行相关应用处理了。
[0106] 删除Alarm时,Batch的start值和end值调整规则:剩下所有Alarm的起始到时时间when中最大的when值即为Batch新的start值,剩下所有Alarm的最晚到时时间maxWhen中最小的maxWhen值即为Batch新的end值。
[0107] 仍然是上面的例子:
[0108] 如果删除了第一个Alarm,剩下的三个Alarm的when中最大的是25,maxWhen最小的为35,即Batch的start值和end值不需要调整;
[0109] 如果删除了第二个Alarm,剩下三个Alarm中when中最大的是25,maxWhen最小的为35,即Batch的start值和end值不需要调整;
[0110] 如果删除了第四个Alarm,剩下三个Alarm中when中最大的是20,maxWhen最小的为40,则Batch的start值则调整为20,end值调整为40。回到了添加第四个Alarm之前的状态。
[0111] 本发明方法的最后一个实施例,在进行Alarm删除时,首先通过Alarm的标识匹配Batch中的所有Alarm,如果匹配不上,则说明该Alarm不存在,操作结束。一旦匹配上了,则记录下该Alarm所在的Batch Index(定时器集合标识),并从该Batch(定时器集合)中删除对应的Alarm。然后根据剩下的Alarm的起始到时时间和最晚到时时间确定该Batch的start值是否需要调整,如果不需要调整,则不需要进行Batch列表的重构和Alarm的重新添加,如果start值需要调整,则保留该Batch下的所有剩下的Alarm,从Batch列表中删除该Batch,然后将先前保留的Alarm添加到Batch列表中。这样最多只需要添加一个Batch中的Alarm,而不是重构整个Batch列表,再重新添加所有的Alarm,效率相对来要提高很多。本实施例包括两个部分:Alarm对应的Batch Index列表构建、根据Batch Index列表重新添加Alarm。
[0112] 第一部分:Alarm对应的Batch Index列表构建,包括:
[0113] 当应用删除还为到时的Alarm时,会调用AlarmManagerService提供的接口函数removeLocked,removeLocked提供了三组参数定义:
[0114] public void removeLocked(PendingIntent operation)
[0115] public void removeLocked(String packageName)
[0116] public void removeLocked(int userHandle)
[0117] Alarm的数据结构中有两个重要的成员定义:
[0118] public PendingIntent operation;
[0119] public int uid;
[0120] PendingIntent是Alarm到时的发送的Intent,可以通过匹配Batch列表中的Alarm数据结构中的PendingIntent来找到要删除的Alarm。packageName是Alarm所在应用的包名,通过PendingIntent的成员函数getTargetPackage即可以获取Alarm所在的包名。userHandle即是Alarm所在应用的uid,直接匹配Batch列表中的Alarm的成员uid即可匹配到要删除的Alarm。由于当参数为应用的包名或uid时,标识要删除对应应用下的所有Alarm,所以要记录的Batch Index必须是列表数组,这样才能够记录要删除的所有Alarm对应的Batch,方便Batch列表的重新构建。流程图如图5所示,系统有一个Batch列表,每个Batch下有一个Alarm列表,首先遍历Batch列表,对列表中的每个Batch,都需要遍历下面的Alarm列表,以确定该Batch列表中是否有要删除的Alarm,如果有并且同时调整了所在Batch的Start值(剩下的Alarm的最大的起始到时时间即为Batch新的start值,剩下Alarm的最小的最晚到时时间即为Batch新的end值,当新的start值与原start值判断不一致时,需要调整)则记录下对应Batch的Index,如果没有匹配的Alarm,则继续遍历Batch,直到遍历完整个Batch列表。最后记录下所有需要重新处理的Batch Index。最后记录下来的Batch Index列表,需要通过遍历删除其中相同的Batch Index,以免后续构建新的Batch时进行重复操作。
[0121] 值得注意的是,流程图中的removeLocked的参数为PendingIntent或uid时,直接从Alarm结构中获取PendingIntent或uid成员进行匹配。参数为应用包名时,先从Alarm结构中获取PendingIntent,调用PendingIntent中的getTargetPackage函数获取Alarm所在应用的包名,再进行匹配。
[0122] 第二部分:根据Batch Index列表重新添加Alarm:
[0123] 当Alarm删除完成后,其对应的需要调整的Batch都已经添加到了Batch Index列表中。接下来需要调整Batch列表。调整Batch的操作会进入到AlarmManagerService的rebatchAlarmsLocked函数中。具体流程如图6所示:
[0124] 首先需要遍历有删除Alarm并且Batch的start值发生过变化的的Batch Index列表,根据Batch Index取出对应的Batch实例,然后保留其下的剩下的Alarm,然后删除该Batch。后面调用AlarmManagerService的setImpl函数将保存的Alarm重新添加到Batch列表中。当Batch Index列表中对应的Batch全部操作完成后,调用AlarmManagerService的rescheduleKernelAlarmsLocked函数设置最近的Batch的start值到底层驱动。
[0125] 本发明的优点在于:通过Batch的start值是否变化来确定Batch是否需要调整,不需要对Batch列表全部推倒重来,优化了系统效率。
[0126] 基于相同的技术构思,本发明实施例还提供一种Alarm的优化管理系统,该系统可执行上述方法实施例。本发明实施例提供的系统如图7所示。本发明系统第一实施例包括遍历查找模块20、控制判断模块10、删除模块30、获取模块40、添加模块50;所述控制判断模块10分别与所述遍历查找模块20、删除模块30、获取模块40、及添加模块50相连;其中:
[0127] 当有Alarm需要删除时,所述遍历查找模块20根据所述Alarm的标识,遍历所述定时器集合列表中的每个定时器集合的Alarm列表,所述控制判断模块10判断是否存在Alarm与待删除的Alarm匹配;
[0128] 若存在Alarm与待删除的Alarm匹配,则所述控制判断模块10记录所述定时器集合的标注,并通过删除模块30删除所述定时器集合中的匹配上的Alarm,所述获取模块40根据所述定时器集合中剩下的Alarm的起始到时时间值和最晚到时时间值,获得所述定时器集合的新起始到时时间值和新最晚到时时间值,所述控制判断模块10判断所述定时器集合的新起始到时时间值是否与原起始到时时间值一致,若是,则结束操作,否则,所述控制判断模块10保留所述定时器集合中剩余的Alarm,通过所述删除模块30删除所述定时器集合,再通过所述添加模块50将所述剩余的Alarm添加到定时器集合列表中的各定时器集合中;
[0129] 若不存在Alarm与待删除的Alarm匹配,则所述控制判断模块10判断结束操作。
[0130] 本发明管理系统实施例,当有Alarm删除时,通过定时器集合的起始到时时间是否变化来确定定时器集合是否需要调整,筛选出需要调整的定时器集合后,再执行后续的定时器集合的重构。
[0131] 较佳的,在上述实施例的基础上,还包括与所述控制判断模块10相连的构建模块60,其中:
[0132] 所述控制判断模块10保留所述定时器集合中剩余的Alarm,并通过所述删除模块30删除所述定时器集合,再通过所述添加模块50将所述剩余的Alarm添加到定时器集合列表中的各定时器集合中包括:
[0133] 所述构建模块60在所述控制判断模块10的控制下构建待调整定时器集合标识列表,并将所述定时器集合的标识添加到待调整定时器集合标识列表中;
[0134] 所述删除模块30删除所述待调整定时器集合标识列表中相同的定时器集合标识;
[0135] 所述遍历查找模块20根据所述待调整定时器集合标识列表,按照所述定时器集合标识查找到对应的定时器集合;
[0136] 所述控制判断模块10保留所述定时器集合中的所有Alarm,并通过所述删除模块30删除所述定时器集合;
[0137] 所述添加模块50将所述保留的所有Alarm添加到所述定时器集合列表的定时器集合中。
[0138] 通过构建删除Alarm对应的待调整定时器集合标识列表来优化定时器集合列表的重构。
[0139] 较佳的,在上述实施例的基础上,所述添加模块50将所述保留的所有Alarm添加到所述定时器集合列表的定时器集合中包括:
[0140] 所述控制判断模块10根据Alarm的添加规则,判断所述Alarm是否能添加到所述定时器集合列表的现有定时器集合中,若是,则所述添加模块50将所述Alarm添加至所述定时器集合中;否则,所述构建模块60根据所述获取模块40获取到的Alarm的起始到时时间值与最晚到时时间值,建立一个新定时器集合,所述添加模块50将所述Alarm添加至所述新定时器集合中,所述新定时器集合的起始到时时间即为所述Alarm的起始到时时间,所述新定时器集合的最晚到时时间即为所述Alarm的最晚到时时间;所述添加模块50将所述新定时器集合添加至所述定时器集合列表中。
[0141] 较佳的,在上述任一实施例的基础上,还包括设置模块70,所述设置模块70与所述控制模块相连,其中:
[0142] 所述获取模块40获取各定时器集合的起始到时时间值,所述设置模块70在所述控制判断模块10的控制下将起始到时时间最先到达的定时器集合的起始到时时间设置到底层驱动。
[0143] 本实施例设置最近的定时器集合的起始到时时间值到底层驱动,即使系统关机了,当所述定时器集合的起始到时时间到达时,仍会唤醒系统,执行相应的应用。
[0144] 尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0145] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。