一种智能终端应用切换方法与流程

文档序号:11154617阅读:403来源:国知局
一种智能终端应用切换方法与制造工艺

本发明属于智能终端应用领域,涉及一种在智能终端中进行应用切换的方法。



背景技术:

随着智能终端功能日益强大,所支持的应用类型逐渐增多,用户对于不同应用的切换需求也逐步显现。例如,当用户通过智能终端玩在线游戏时,收到一条微信,有时希望游戏不被打断,但又希望能够及时看到微信消息。通常情况下,在游戏界面下用户无法直接浏览微信消息,需要用户切换应用来才能查看微信消息。切换方式一:点击home(用来退出到桌面)键,然后进入智能终端的桌面,在桌面中选择微信点击进入,看完信息后,再点home(用来退出到桌面)键,退回到桌面,最后选择游戏图标点击回到刚才的场景。通过分析可知,这种切换方式至少需要3个步骤来进行操作,如果用户的智能终端的桌面具有多屏显示界面,且微信和/或游戏没有设置在桌面第一屏显示,则操作步骤可能更多,耗时更多,则有可能错过在线游戏的重要环节,给用户带来不好的用户体验。切换方式二:当游戏界面支持下拉通知栏时,在游戏界面中通过下拉通知栏点击微信通知,然后进入微信进行查看,看完后点击返回键退出微信,回到之前的游戏界面,通过分析可知,这种切换方式也至少需要3步以上才能完成,并且还有可能当前的游戏应用不支持下拉通知栏的操作。切换方式三:如果智能终端支持最近任务键功能,则可以在游戏界面点击最近任务键,然后出现一个任务栈列表,从中选择微信应用(假设之前启动过微信)启动,完成后,再点击最近任务键,选择列表中的游戏,回到游戏界面。

上述三种切换方式是智能终端用户在切换应用时最常使用的方式,彼此之间可以交错进行,例如通过下拉通知栏进入微信,通过按最近任务键返回游戏界面,用户可以根据自己的操作习惯进行组合。但无论怎样组合,都至少需要3步才能完成应用切换操作。

如果仅是进行单次切换,用户未必能体会到操作的不便性,但如果在玩在线游戏的过程中,多次接收到微信消息,并且每次都可能需要我们及时进行回复,即有可能需要同时玩在线游戏并聊天,此时如果需要大量重复上述几种切换方式,将带来不好的用户体验。

类似的场景还有很多,例如使用浏览器或者阅读器查看资料或者阅读文档时,收到了短消息,QQ或者微信,也需要进行类似的应用切换步骤,多次操作后,同样将带来不好的用户体验。



技术实现要素:

为克服上述现有技术的不足,本申请提出了一种智能终端应用切换方法及系统,能够快速地在应用之间进行切换,其特征在于:获取智能终端系统版本号;根据系统版本号获得对应的应用进程信息;生成最近应用列表以及可用最近应用列表;其中所述最近应用列表用于存储最近应用;可用最近应用列表用于存储经过过滤后的合适的最近应用;提取最近应用列表中的应用进程,判断是否符合判断规则,如果不符合,则将其过滤,如果符合则将其保存在可用最近应用列表;切换时,将最新的后台应用切换为前台应用;同时前台应用被切换为后台应用;再次切换时,将最新后台应用切换为前台应用,同时前台应用被切换为后台应用;重复切换,实现两个应用之间快速切换。

根据本发明的一个优选实施方式,所述判断规则为应用是否为桌面应用。根据本发明的一个优选实施方式,切换时,如果发生异常,则提示“无可切换应用”。根据本发明的一个优选实施方式,通过悬浮窗按钮进行单击、双击或长按的方式实现应用切换。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。

附图说明

图1示出了已有发明的一个具体实施方式的智能终端应用切换方法;

图2示出了根据本发明一个优选实施方式的应用切换示意图;

图3示出了根据本发明一个具体实施方式的提示用户开启权限的示意图;

图4示出了根据本发明一个优选实施方式的应用切换示意图;

图5-1和图5-2示出了根据本发明一个具体实施方式的Android5.0以下系统应用切换流程图;

图6-1和图6-2示出了根据本发明一个具体实施方式的Android5.0系统应用切换流程图;

图7-1和图7-2示出了根据本发明一个具体实施方式的Android5.0以上系统应用切换流程图。

具体实施方式

为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的一种智能终端应用切换方法其具体实施方式、特征及其功效,详细说明如后。在下述说明中,不同的“一实施例”或“实施例”指的不一定是同一实施例。此外,一或多个实施例中的特定特征、结构、或特点可由任何合适形式组合。

缩略语和关键术语定义

悬浮窗按钮:移动设备在开启之后,屏幕当中出现一个圆形或者其它图片形式的虚拟按钮,它可以随意拖动到屏幕上的任意位置,并且可以悬浮于大多数的应用界面之上。

Android:中文名称为安卓,是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。

Handler:Handler是Android中的一个消息分发对象。而消息分发,有赖于消息循环,也就是Looper。在一个线程中,Looper阻塞线程,等待消息构成循环,有了消息,分配到对应的Handler,让它进一步分发处理。

Intent:“意向、打算”的意思。Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

Context:可以理解为“上下文”:它贯穿整个应用。也可以理解成“运行环境”。它提供了一个应用运行所需要的信息,资源,系统服务等。同样可以理解成“场景”,用户操作和系统交互这一过程就是一个场景,比如Activity之间的切换,服务的启动等都少不了Context。

Activity:是Android四大组件之一,形象的说就是一个容器,在里面放置各种控件(按钮,文本,复选框等),就形成了软件的界面,Activity是可见的,如果不加任何控件的话,那么就像Windows中的空白窗体一样。

如图2和4所示,通过操作悬浮窗按钮的方式来切换两个应用,悬浮窗按钮可以悬浮任何程序之上,获取后台运行的程序和对应的程序图标;新建悬浮窗口,将所述程序图标显示在所述悬浮窗口;当所述悬浮窗口中的程序图标检测到启动指令时,将所述程序图标对应的程序切换到前台运行。将后台运行的应用程序对应的程序图标以悬浮窗口的形式显示在屏幕中,当程序图标检测到启动指令时,将所述程序图标对应的程序切换到前台运行。

当采用这种方式进行切换时,需要获取后台运行的程序和对应的程序图标。本领域技术人员知晓,Android系统版本更新较快,最新发布的系统为7.1,不同的Android系统版本差别较大,开发时需要区分版本使用不同的方式来实现。Android 5.0以后的系统版本中,在获取应用信息时,需要用户赋予应用“有权查看使用情况的应用”权限才能读取到后台应用信息。通常,用户进行过操作的应用都将在后台记录,除非用户主动进行清理,或者智能终端刚开机,后台程序尚未启动。当采用上述方式进行引用切换时,将至少存在四点不足:一、没有指明怎样获取后台应用程序,以及后台那个应用,因为后台应用往往是一个列表,应该需要明确出具体那种类型后台应用,那种是不需要获取的,如对于桌面应用应该需要过滤掉的,同时也没有指明系统版本不同,获取的方法是不同的;二、需要获取应用的图标,并将其显示在悬浮窗口中,不仅增加了程序复杂度,还会带来隐私泄露方面的问题;三、没有明确如何操作悬浮窗按钮来切换前台应用和后台应用,没有指明如何检测启动指令;四、没有明确在没有后台应用时以及悬浮窗按钮程序没有权限读取后台应用时,该怎样处理。此时点击悬浮窗按钮可能没有任何反应,用户遇到此种情况将会很迷茫,不知道哪里出现了问题,用户体验将大打折扣。

根据本发明的一个具体实施方式,针对当前不同的Android系统版本,采用不同的方法来获取当前的最新后台应用,并且将桌面应用过滤掉,保证获取到的应用程序数据正确,从而保证快速切换的准确;其次,前台应用可以为任意类型的应用,而要即将切换到前台的后台应用只能为非桌面应用,因为对于桌面应用将其切换到前台,相当于之前的前台应用退出,进入到了后台看不到了,用户使用过程中将有可能产生错觉,这样的切换是没有意义的,因此需要将桌面应用过滤掉;再次,通过对悬浮窗按钮实施单击动作,将不受应用场景的限制,因为悬浮窗按钮可以出现在任何应用之上,可以在任何窗口中实现。并且采用的单击这样的动作,符合用户的日常使用习惯;此外,不需要额外获取应用程序图标,这样不仅减少程序复杂度,节省了系统内存的开销,还可以避免隐私泄露的问题;最后,对于后台应用程序列表为空,或者由于没有授予读取应用信息权限而导致的获取后台应用失败等,应该根据不同的情况给用户以相应的提示,防止操作按钮后没有任何反应。

如图2所示,圆圈中示出了根据本发明一个优选实施方式的悬浮窗按钮,通过点击悬浮窗按钮,可以将当前应用切换到后台,而同时打开后台中最新的一个后台应用,从而起到快速切换应用的目的。

假如这时后台有很多应用,最新的一个后台应用是微信,如图4所示,这时点击悬浮窗按钮后则将微信应用调用出来,而之前的影视大全应用将退到后台,成为最新的后台应用。如果再次点击图4中所示的悬浮窗按钮,则将影视大全应用调用到前台,同时微信变为最新的后台应用,如图2所示。

根据本发明的一个具体实施方式,提供一种智能终端应用切换方法,获取系统版本号;根据系统版本号获得对应的应用进程信息;生成最近应用列表以及可用最近应用列表;其中所述最近应用列表用于存储最近应用;可用最近应用列表用于存储经过过滤后的合适的最近应用;提取最近应用列表中的应用进程,判断是否符合判断规则,如果不符合,则将其过滤,如果符合则将其保存在可用最近应用列表;将最新的后台应用切换为前台应用;同时前台应用被切换为后台应用;再次切换,将最新后台应用切换为前台应用。

根据本发明的一个具体实施方式,所述判断规则为应用是否为桌面应用。根据本发明的一个具体实施方式,切换时,如果发生异常,则提示用户“无可切换应用”。根据本发明的一个具体实施方式,通过悬浮窗按钮进行应用切换。

根据本发明一个具体实施方式,其中的悬浮窗按钮是一个ImageButt on(图片控件)控件。通过调用Android系统的WindowManager(窗口管理器)提供的addView方法在系统界面管理器中添加一个窗口,并将此新加的窗口的优先级设置为WindowManager.LayoutParams.TYPE_SYS TEM_ALERT(一种系统警告类型的属性)级别的,这样它的优先级非常的高,就可以显示于大多数系统窗口之上了,达到“悬浮”于其它窗口之上的目的。

对于悬浮窗按钮的各种操作事件来说,单击事件很容易处理,因为它本身是一个图片控件,有系统自带的OnClickListener(控件单击监听器),点击控件后监听器触发,就会调用其onClick方法,监听器可以调用。也可以通过调用悬浮窗按钮的onTouchEvent(按钮按下,移动,抬起动作发生时会触发此事件)方法,根据MotionEvent.ACTION_DOWN(表示按下动作发生)和MotionEvent.ACTION_UP(表示抬起动作)不同状态来实现。

由于需要将单击与双击、长按等事件区分开,在本发明的一个优选实施方式中,采用后一种方式,单击实现方式如下:

使用一个整型变量mClickCount,它的初值为0,在onTouchEvent方法中,每收到一次MotionEvent.ACTION_DOWN消息,就将整型变量mClickCount加一,如果接着收到一个MotionEvent.ACTION_UP消息,将延迟发送一个ClickPressedThread(实现了Runnable的一个类)对象给当前的Handler进行处理,延迟时间为230毫秒(这个值是参考系统单击和双击之间的时间间隔定义的),如果在这个时间内,没有再次收到M otionEvent.ACTION_DOWN消息,将作为一次单击进行处理;如果再次收到MotionEvent.ACTION_DOWN消息说明当前进行了双击或更高次数的点击,这时按双击或其他点击类型事件来处理。

根据本发明的一个优选实施方式,通过获得最新后台应用启动的Inte nt,然后调用addFlags方法设置一下Intent.FLAG_ACTIVITY_NEW_TA SK(一种应用启动模式)属性,再调用Context的startActivity(Intent intent)(一种启动Activity的方法)就可以启动后台应用了。本发明实现的难点在于如何获取到最新的后台应用。

Android系统版本5.0以后的版本,已不再直接对外提供获取后台应用的接口了,只能通过其他的方式变相获取后台应用的数据,例如,通过系统的UsageStatsManager应用使用情况服务管理器,获取系统应用的使用轨迹,然后根据应用使用轨迹的时间进行排序,从而找到最新的后台应用程序,但这种方法需要用户赋予当前程序权限才能读取到数据,因此需要针对此种限制进行适配。当用户在Android系统版本5.0以上机型进行应用切换时,首先调出Android系统的授权框,例如,对于三星手机一般为“使用量数据访问”窗口,然后在其上,我们创建一个半透明的蒙版,如图3所示,并给以提示,例如“找到XXX应用,然后开启”,通过这种方式给予用户提示,他只有在开启了相应的权限后,我们才能获取到系统的数据,才能实现快速切换的功能。

某些型号的手机是跳转到窗口“有权查看使用情况的应用”,进行权限设置。与“使用量数据访问”窗口类似,只是窗口的显示名称不同而已。

以上介绍的是针对Android 5.0以上智能终端才会出现的情况,下面将根据不同的Android系统版本,分析如何找到最新应用程序的。

根据本发明的一个优选实施方式,针对Android系统版本5.0以下的智能终端(即SDK版本level小于21的系统),由于Android5.0以下的系统主要是通过调用ActivityManager界面管理器的getRecentTasks()方法得到前台运行的进程和所有后台运行的进程信息,以及通过getRunnin gAppProcesses()方法得到的当前每个运行中进程的详细信息,然后通过以上这些信息过滤出最新的非桌面,并且是有效的后台应用,然后借助两个列表recentTasks和availableRecentTasks进行转存,接着通过不同的情况判断availableRecentTasks列表中的元素哪个有效,从而获取到最新的后台应用,最后调用Context的startActivity(Intent intent)(一种启动Activity的方法)将其切换到前台,而之前的前台应用自动会转到后台,成为最新的后台应用。如果再点击切换,又会将变成最新的后台应用切换到前后,而前台应用则变成最新的后台应用。如此反复,就实现了最新的后台应用和前台应用的相互快速切换。

根据本发明的一个优选实施方式,针对Android系统版本5.0的智能终端(即SDK版本level等于21的系统),由于Android5.0的系统已经不对外开放getRecentTasks()方法,所以不能通过这个方法来查询系统的当前运行的和所有后台的应用。针对此系统的特殊性,只能通过调用Acti vityManager界面管理器的getRunningAppProcesses()方法得到的当前所有进程的详细信息,然后根据得到的信息过滤出最新的非桌面,并且是有效的后台应用,同时借助两个列表recentTasks和availableRecentTasks进行转存,接着通过不同的情况判断availableRecentTasks列表中的元素那个有效,从而获取到最新的后台应用,最后调用Context的startActivit y(Intent intent)(一种启动Activity的方法)将其切换到前台,而之前的前台应用自动会转到后台,成为最新的后台应用。如果再点击切换,又会将变成最新的后台应用切换到前后,而前台应用则变成最新的后台应用。如此反复,就实现了最新的后台应用和前台应用的相互快速切换。

根据本发明的一个优选实施方式,针对Android系统版本5.0以上的智能终端(即SDK版本level大于21的系统),由于Android5.0以上的系统不仅getRecentTasks()方法不对外开放,getRunningAppProcesses()方法也不再开放,因此通过之前的方法已经无法获取到系统最近应用列表。在此系统上我们采用了一种特殊的方法,通过系统的UsageStatsMa nager应用使用情况管理器可以获取到每个应用的使用的历史记录信息,通过分析这些纪录信息,找到当前运行的前台进程和最新的后台进程,然后调用Context的startActivity(Intent intent)(一种启动Activity的方法)将其切换到前台,而之前的前台应用自动会转到后台,成为最新的后台应用。如果再点击切换,又会将变成最新的后台应用切换到前后,而前台应用则变成最新的后台应用。如此反复,就实现了最新的后台应用和前台应用的相互快速切换。需要注意的是,使用系统的情况管理器得到系统的授权,需要引导用户到如图3所示的“使用量数据访问”或者“有权查看使用情况的应用”的系统设置界面(需要注意的是,不同的系统显示名称不同,但在程序里对应的窗口类名是相同的)中将悬浮窗应用开关打开才可以获取到应用历史使用信息。

为实现上述目的,本发明提供了详细的利用Android不同的系统版本对应不同的方法来实现快速切换前台应用和最新的后台应用的方法。

图5-1和图5-2示出了Android5.0以下系统应用切换的详细实现流程。

S501:启动切换函数:获取代表系统版本的整型常量android.os.Bui ld.VERSION.SDK_INT,判断其值是否小于21(21表示Android5.0),当小于21时表示是Android5.0以下的系统,启动对应的切换函数。

S502:定义两个列表,一个为最近应用列表recentTasks,另一个为可用最近应用列表availableRecentTasks,列表中的元素类型为RecentT askInfo:定义两个列表类型的变量recentTasks和availableRecentTask s,列表类型为ArrayList<RecentTaskInfo>,列表每个元素为RecentTas kInfo类型的变量。最近应用列表recentTasks用来存储最近应用;可用最近应用availableRecentTasks用来存储经过过滤后的合适的后台进程应用。

S503:调用ActivityManager界面管理器的getRunningAppProcess es方法获取到正在运行的进程信息,生成一个临时进程列表:ActivityMa nager界面管理器中的getRunningAppProcesses方法能够返回当前系统正在运行的进程列表。此列表每个元素为RunningAppProcessInfo类型的变量,它存储有每个进程的详细信息,如进程名称,进程ID,用户ID等信息。

S504:轮询此临时进程列表,将此列表中的元素依次导入一个Hash Map类型的变量mapInfo中:定义一个HashMap<String,RunningAppP rocessInfo>类型的HashMap,假如命名为mapInfo。使用循环的方式,依次轮训通过getRunningAppProcesses方法返回的临时列表,将每个元素和元素对应的包名相对应,存储到HashMap变量mapInfo中,其中包名为对应的key值,RunningAppProcessInfo元素为value值。

S505:调用ActivityManager界面管理器的getRecentTasks(3,2)方法,得到最近的3个应用程序,并将结果保存到列表recentTasks中:通过ActivityManager界面管理器的getRecentTasks可以得到最近打开的应用,一般手机通过按系统的home键可以看到这些应用列表。getRecent Tasks有两个参数,第一个参数表示从应用列表中获取最多应用的个数,第二个参数表示获取应用列表的方式,这里传入2,代表一个系统属性R ECENT_IGNORE_UNAVAILABLE(2),表示获取的数据过滤掉不可达的应用,然后将得到的数据保存到列表recentTasks中。注意此时列表r ecentTask最多有三个元素,这些元素表示最新运行过的程序。

S506:使用循环,轮询最近应用列表recentTasks:使用循环,开始轮询最近应用列表recentTasks,依次取出每个元素。如果循环正常结束,则执行S5018,否则,继续执行S507。

S507:获取当前元素,每个元素是RecentTaskInfo类型的,这个类型保存有运行进程的详细信息,根据元素baseIntent属性获取到对应的I ntent:每个元素为RecentTaskInfo类型的数据,它存储有每个后台进程的详情信息。不同于RunningAppProcessInfo类型,它存储的内容更丰富一些,并实现了Parcelable接口,可以作为对象数据保存到文件中。通过baseIntent属性获取启动此应用的Intent,通过此Intent可以将其切换到前台。

S508:判断Intent是否合理;根据本发明的一个具体实施方式,可判断Intent是否为空,或者出现其他异常情况,在使用Intent之前一般都要先对其进行判断。如果判断结果为是,则执行S509,否则执行S5010;

S509:继续循环,取进程列表recentTasks的下一个元素:如果Int ent值不合理,则需要跳过此轮循环,然后获取进程列表recentTasks的下一个元素,继续进行轮询。

S5010:判断Intent对应的应用是否为桌面应用:由于切换的后台应用不包括桌面,所以当前取到的元素如果为桌面,需要将其过滤掉,不对其处理。如果判断结果为是,则执行S509,否则执行S5011;

S5011:根据Intent获取对应应用的包名packageName和Compon entName组件对象:如果Intent不为空,也不是桌面应用,则通过Intent 的getComponent()方法获取到Intent对应的ComponentName组件对象,ComponentName是实现了Parcelable的一个类,其中保存有包名和启动类的类名信息。

S5012:判断ComponentName组件对象是否为空:判断Compone ntName组件对象是否为空,因为有的应用可能没有启动信息,此种应用也是无效的后台应用,我们不对其进行切换,需要将其过滤掉。如果判断结果为是,则执行S509,否则执行S5013;

S5013:根据包名packageName查询HashMap变量mapInfo,得到每个包名对应的RunningAppProcessInfo进程详情对象:如果Compo nentName组件对象不为空,说明其是有效的后台应用,获取其存储的包名信息,然后通过此包名查询之前建立的HashMap变量mapInfo,找到包名对应的RunningAppProcessInfo类型的元素,获取到包名对应的进程详情。

S5014:判断RunningAppProcessInfo进程详情对象是否为空:对得到的包名详情对象进行是否为空的判断,如果为空,则取下一个元素继续循环,不为空则表示是一个实体进程详情对象。如果判断结果为是,则执行S509,否则执行S5015;

S5015:判断RunningAppProcessInfo进程是一个有效的进程:继续判断此对象是否为有效的进程。如通过对应的ComponentName组件对象能否进一步查询得到界面的ActivityInfo信息数据,应用名称等,如果满足能够得到,则表示为一个有效的进程。否则取下一个元素继续循环。如果判断结果为否,则执行S509,否则执行S5016;

S5016:判断进程列表availableRecentTasks大小是否小于3:进行循环,轮询列表recentTasks的目的是为了取出有效的数据放到进程列表availableRecentTasks中,所以在将合适的元素插入列表availableRecen tTasks之前,首先需要判断其大小是否小于3,即该列表最多存储两个元素。如果判断结果为是,则执行S5017,否则执行S5018;

S5017:将此RecentTaskInfo添加到应用列表availableRecentTask s中:如果满足列表availableRecentTasks元素个数小于3个的要求,就将其插入列表中;继续执行S509。

S5018:跳出或正常结束循环:列表recentTasks轮询完成,或者a vailableRecentTasks列表已经取到了两个元素,这时都要退出循环,不再轮询。

S5019:判断列表availableRecentTasks的元素个数是否为0:循环退出后,先判断得到的列表availableRecentTasks中的元素个数是否为0。如果为0,则执行S5030提示用户“无可切换应用”,说明没有后台应用可以进行切换,然后执行S5032退出函数,结束切换。

S5020:判断列表availableRecentTasks的元素个数是否大于1:如果列表availableRecentTasks中的元素个数不等于0,则继续进行判断个数是否大于1。如果不大于1,则继续执行S5021;如果大于1,则执行S5023;

S5021:列表availableRecentTasks只有一个元素,取得列表availa bleRecentTasks的这个元素和应用列表recentTasks的第一个元素:此时列表元素个数为1,即只有一个元素,则这个元素很可能就是后台最新的需要切换的那个应用。这时同时取出应用列表recentTasks中的第一个元素,因为这个元素表示当前正在运行的应用程序,即前台应用程序。

S5022:获取应用列表recentTasks的第一个元素:如果列表availa bleRecentTasks的元素个数大于1,说明有两个元素,这时再获取应用列表recentTasks的第一个元素(前台应用),准备进一步的判断。注意列表recentTasks的第一个元素是前台应用。

S5023:这个元素对应的应用是否为桌面应用:判断列表recentTask s的第一个元素是否为桌面应用,即当前前台应用是否是桌面应用,或者理解为当前是否处于桌面情况下。如果判断结果为是,则执行S5025,如果判断结果为否,则执行S5026;

S5024:判断这两个元素是否相等:判断列表availableRecentTasks 的唯一元素和recentTasks中的第一个元素(前台应用)是否相等,如果相等,表示后台没有其他应用程序了,只有一个前台程序,此时没有后台程序可以切换,提示用户“无可切换应用”,然后退出切换函数。如果判断结果为是,则执行S5030;如果判断结果为否,则执行S5027;

S5025:取得列表availableRecentTasks的第一个Intent元素作为启动Intent:如果列表recentTasks的第一个元素是桌面应用,则取出列表availableRecentTasks的第一个Intent元素,因为列表availableRecentT asks中已经将桌面应用过滤掉了,它里面的元素都是非桌面应用,所以此时应该取出最新的一个后台应用,即第一个元素,作为切换的对象。

S5026:取得列表availableRecentTasks的第二个Intent元素作为启动Intent:如果列表recentTasks的第一个元素不是桌面应用,则由之前的循环可以知道,这时列表recentTasks的第一个元素和availableRecen tTasks的第一个元素是相等的,所以取availableRecentTasks的第二个元素作为切换的对象。

S5027:将列表availableRecentTasks的这个Intent元素作为启动I ntent:如果列表availableRecentTasks的唯一元素和recentTasks中的第一个元素(前台应用)不相等,表示前台应用和后台最新的应用不是同一应用,则将列表availableRecentTasks的这个Intent元素作为启动Int ent,准备将此后台进程切换到前台。

S5028:根据启动应用的Intent,调用Context的startActivity方法启动此后台进程:根据不同的情况获取到启动应用的Intent,调用Context的startActivity方法启动此后台进程,而前台进程将变成最新的后台进程。

S5029:startActivity方法执行是否有异常发生:在执行切换过程中存在有发生异常的情况,所以需要使用java的try-catch机制保证对异常进行捕获,然后进行处理。如果有异常发生,则执行S5030;如果没有异常,则执行S5031;

S5030:提示用户“无可切换应用”:如果发生各种不符合算法的情况,均提示用户“无可切换应用”。

S5031:如果未发生异常,则表示切换成功。可以看到最新的后台进程变成前台进程,而前台进程切换到后台,成为最新的后台进程。

S5032:函数退出,结束:切换执行完成,退出切换函数。

图6-1和6-2示出了Android5.0系统应用切换的详细实现流程。

S601:启动切换函数:获取代表系统版本的整型常量android.os.Bui ld.VERSION.SDK_INT,判断其是否等于21(21对应Android5.0系统),等于21表示是Android5.0的系统,启动对应的切换函数。

S602:定义两个列表,一个为最近应用列表recentTasks,另一个为可用最近应用列表availableRecentTasks,列表中的元素类型为Intent:定义两个列表类型的变量recentTasks和availableRecentTasks,列表类型为ArrayList<Intent>,列表每个元素为Intent类型的变量。最近应用列表recentTasks用来存储最近应用;列表availableRecentTasks用来存储经过过滤后的合适的后台进程应用。

S603:调用ActivityManager界面管理器的getRunningAppProcess es方法获取到正在运行的进程信息,生成一个临时进程列表:ActivityMa nager界面管理器中的getRunningAppProcesses方法能够返回当前系统正在运行的进程列表。此列表每个元素是RunningAppProcessInfo类型的变量,它存储有每个进程的详细信息,如进程名称,进程ID,用户ID等信息。

S604:使用循环,轮询此临时进程列表:使用循环,开始轮询这个临时列表,依次取出每个元素。如果循环正常结束,则执行S6014;

S605:获取当前元素,每个元素是RunningAppProcessInfo类型的,这个类型保存有运行进程的详细信息,根据元素信息获取到对应的包名:获取循环中的当前元素,它存储有每个后台进程的详情信息,每个元素为RunningAppProcessInfo类型的数据,不同于RecentTaskInfo类型,它存储的内容相对精简一些,有进程名称,进程ID,用户ID等,并实现了Parcelable接口,可以作为对象数据保存到文件中。通过processName 进程名属性可以获取启动此应用的进程名称,此进程名称一般使用包名来表示。

S606:判断包名是否等于当前悬浮窗所在应用程序的包名:判断从R unningAppProcessInfo类型的数据中得到的包名是否等于当前悬浮窗所在应用程序的包名,因为需要将悬浮窗所在应用程序从列表中排除掉。如果判断为是,则执行S607;如果判断为否,则执行S608;

S607:继续循环,取临时进程列表的下一个元素:如果取到的元素对应包名等于当前悬浮窗所在应用程序的包名,说明当前取到的数据是悬浮窗程序,将其过滤掉,继续循环,取下一个元素进程处理。

S608:根据包名信息,通过包名管理器PackageManager的getLau nchIntentForPackage方法获取到启动应用的Intent:有了包名,就可以通过系统的包名管理器PackageManager的getLaunchIntentForPackage 方法,查询出包名对应的启动应用程序所需的Intent。

S609:判断Intent是否为空:判断得到的Intent是否为空,因为有了包名,但是不一定有启动界面的应用程序,所以这一项有可能为空,需要进行判断。如果判断是,则执行S607,如果判断为否,则执行S6010;

S6010:判断最近应用列表recentTasks的大小是否小于3:进行循环,轮询临时列表的目的是为了取出有效的数据放到进程列表recentTas ks中,判断其大小是否小于3,表示这个列表最多存储两个元素即可。如果判断为是,则执行S6011;如果判断为否,则执行S6014;

S6011:将此Intent添加到应用列表recentTasks中:将这个Intent添加到应用列表recentTasks中,为后续判断后台应用做准备。

S6012:通过自定义的方法,查询系统所有的桌面应用,判断这个Intent对应的应用是否属于这些桌面应用中的某个,来判断Intent是否属于桌面应用。如果判断结果为否,则执行S6013,如果判断结果为是,则执行S607;

S6013:将此Intent添加到应用列表availableRecentTasks中:如果不属于桌面应用,将此Intent同时保存到列表availableRecentTasks中。

S6014:跳出或正常结束循环:当应用列表recentTasks中的个数为3时,或者临时列表循环完成,这时将结束循环。执行S607;

S6015:判断列表availableRecentTasks的元素个数是否为0:循环退出后,先判断得到的列表availableRecentTasks中的元素个数是否为0。如果判断结果为是,则执行S6027,提示用户“无可切换应用”,说明没有后台应用可以进行切换;如果判断结果为否,则执行S6016,退出函数,结束切换;

S6016:判断列表availableRecentTasks的元素个数是否大于1:如果列表availableRecentTasks的元素个数大于1,说明有两个元素,这时再获取应用列表recentTasks的第一个元素(前台应用),准备进一步的判断。注意列表recentTasks的第一个元素是前台应用。如果判断结果为否,则执行S6017,如果判断结果为是,则执行S6018;

S6017:列表availableRecentTasks只有一个元素,取得列表availa bleRecentTasks的这个元素和应用列表recentTasks的第一个元素:此时列表大小为1,只有一个元素,则这个元素很可能就是后台最新的需要切换的那个应用。这时同时取出应用列表recentTasks中的第一个元素,因为这个元素表示当前正在运行的应用程序,即前台应用程序。继续执行S6019;

S6018:应用列表recentTasks的第一个元素:如果列表availableR ecentTasks的元素个数大于1,说明有两个元素,这时再获取应用列表r ecentTasks的第一个元素(前台应用),准备进一步的判断。注意列表r ecentTasks的第一个元素是前台应用。

S6019:判断这两个元素是否相等:判断列表availableRecentTasks的唯一元素和recentTasks中的第一个元素(前台应用)是否相等,如果相等,表示后台没有其他应用程序了,只有一个前台程序,此时没有后台程序可以切换,提示用户“无可切换应用”,然后退出切换函数。如果判断结果为是,则执行S6027;如果判断结果为否,则执行S6020;

S6020:将列表availableRecentTasks的这个Intent元素作为启动I ntent:如果列表availableRecentTasks的唯一元素和recentTasks中的第一个元素(前台应用)不相等,表示前台应用和后台最新的应用不是同一应用,则将列表availableRecentTasks的这个Intent元素作为启动Int ent,准备将此后台进程切换到前台。继续执行S6024;

S6021:判断列表recentTasks的第一个元素是否为桌面应用,即当前前台应用是否是个桌面应用,或者理解为当前是否处于桌面情况下。如果判断结果为否,则执行S6023,如果判断结果为是,则执行S6022;

S6022:取得列表availableRecentTasks的第一个Intent元素作为启动Intent:如果列表recentTasks的第一个元素是桌面应用,则取出列表availableRecentTasks的第一个Intent元素,因为列表availableRecentT asks中已经将桌面应用过滤掉了,它里面的元素都是非桌面应用,所以此时应该取出最新的一个后台应用,即第一个元素,作为切换的对象。继续执行S6024;

S6023:取得列表availableRecentTasks的第二个Intent元素作为启动Intent:如果列表recentTasks的第一个元素不是桌面应用,则由之前的循环可以知道,这时列表recentTasks的第一个元素和availableRece ntTasks的第一个元素是相等的,所以取availableRecentTasks的第二个元素作为切换的对象。继续执行S6024;

S6024:根据不同的情况获取到启动应用的Intent,调用Context的s tartActivity方法启动此后台进程,而前台进程将变成最新的后台进程。

S6025:判断startActivity方法执行是否有异常发生:在执行切换过程中存在有发生异常的情况,所以需要使用java的try-catch机制保证对异常进行捕获,然后进行处理。如果判断结果为是,则执行S6027;如果判断结果为否,则执行S6026;

S6027:提示用户“无可切换应用”:如果发生各种不符合算法的情况,均提示用户“无可切换应用”。

S6027:如果未发生异常,则表示切换成功。可以看到最新的后台进程变成前台进程,而前台进程切换到后台,成为最新的后台进程。

S6028:函数退出,结束:切换执行完成,退出切换函数。

图7-1以及图7-2示出了Android5.0以上系统应用切换的详细实现流程。

S701:启动切换函数:获取代表系统版本的整型常量android.os.Bui ld.VERSION.SDK_INT,

S702:判断其是否大于21,当大于21时判断当前系统版本为Andr oid5.0以上系统;

Android5.0以上系统不再对外提供getRecentTasks()方法和getRun ningAppProcesses()方法,无法通过之前的方案来获取前台进程和后台进程信息。所以需要采用其他特殊的方案来间接获取到这些进程的信息,才能为切换提供前提条件。

S703:Android5.0以上的系统内置有一个应用使用情况管理器Usa geStatsManager,它用来记录曾经运行过的应用信息,信息数据包括,应用启动时间,应用对应的包名,启动类名等,通过这些信息就可以得到应用启动运行时间点的先后顺序,当前正在运行的应用,后台运行过的应用,每个应用对应的包名,启动类名等信息,获得这些信息后就有了实现快速切换的前提条件。首先,通过系统的UsageStatsManager应用使用情况管理器得到系统服务usagestats,然后根据系统服务usagestats的quer yUsageStats方法可以获取到应用的情况,由于这个文件记录每一次运行的数据,所以内容很多,我们只需要取其最新的一天数据即可,然后将其保存到列表listTasks中。

S704:判断得到的数据--列表listTasks是否为空;这里涉及到一个权限问题,对于没有授权的应用,得到的这个列表肯定是空的,如果有授权,如果时间间隔为1天,得到的数据是不会为空的,因为只要程序开机启动,就会有数据报上来。如果判断结果为是,则执行S705;如果判断结果为否,则执行S709;

S705:跳转到“有权查看使用情况的应用”的系统设置界面,并在此界面上弹出一个蒙版形式的引导框,显示一些引导文字,引导用户打开此应用的开关,只有开关开启,应用才有权限读取到系统服务usagestats中的数据:如果得到的列表为空,说明当前应用没有权限读取应用的使用情况,所以需要跳转到“有权查看使用情况的应用”的系统设置界面,并在此界面上弹出一个蒙版形式的引导框,显示一些引导文字,引导用户打开此应用的开关,只有开关开启,应用才有权限读取到系统服务usagest ats中的数据。

S706:判断用户是否打开了本应用程序对应的开关,由于系统没有对外提供相应的接口,所以继续使用queryUsageStats方法查询信息,检查返回的列表是否为空。如果判断结果为是,则执行S707,如果判断结果为否,则执行S708;

S707:重新根据系统服务usagestats的queryUsageStats方法获取到间隔为一天的进程运行情况列表listTasks,如果根据系统服务usagest ats的queryUsageStats方法获取到间隔为一天的进程运行情况列表listT asks不为空,说明开关打开,开始下一步的逻辑处理。

S708:如果没有打开此开关,再重新点击后,列表listTasks还是为空,需要重新提示用户:如果列表listTasks继续为空,说明用户没有打开开关,在下一次进入时,继续提示用户,引导其打开开关。继续执行S705;

S709:使用循环,轮询listTasks列表中的每个元素,将此列表中非桌面的系统应用移除:使用循环方式,开始轮询listTasks列表中的每个元素,将此列表中的系统类型的应用移除,并且这样的应用是非桌面应用,即桌面应用需要保留。

S7010:判断listTasks列表的元素个数是否为1:循环完成,判断最终得到的列表listTasks的元素个数是否为1,只有一个元素时可以作为一种特殊情况来进行处理。如果判断结果为是,则执行S7011,如果判断结果为否,则执行S7013;

S7011:此时后台只有一个应用可以切换,所以此时直接切换此应用,不用再作判断:如果列表listTasks只有一个元素,说明只有一个后台应用可以进行切换,因此可以直接切换到此后台应用,不用再作更多的判断。

S7012:取得listTasks列表的唯一元素,根据此元素的包名信息获取到启动应用的Intent:在切换后台应用时,需要先得到启动应用对应的Int ent,这里使用PackageManager包管理的getLaunchIntentForPackage()方法通过传递包名参数,得到对应的启动Intent。继续执行S7020;

S7013:获取listTasks列表第一个元素,判断其是否为桌面应用:如果listTasks列表的元素个数大于1,则取出这个列表的第一个元素,并判断这个元素对应的应用是否为桌面应用。此时这个元素是当前正在运行的应用,即前台应用。如果判断结果为是,则执行S7015,如果判断结果为否,则执行S7014;

S7014:如果不是桌面应用,设置标志flag等于false:如果这个应用不是桌面应用,则设置一个标志flag等于false,表示列表的第一个元素不是桌面应用。继续执行S7016;

S7015:如果为桌面应用,设置标志flag等于true:如果这个应用是桌面应用,则设置标志flag等于true,表示列表的第一个元素是桌面应用。继续执行S7016;

S7016:使用循环,轮询listTasks列表中的每个元素,将此列表中的桌面类型的应用移除:使用循环,开始轮询listTasks列表中的每个元素,将此列表中的桌面类型的应用移除。继续执行S7017;

S7017:判断标志flag是否为true:循环完成后,开始判断标志flag是否等于true,等于true表示前台应用为桌面应用,等于false表示是非桌名的普通应用。如果判断结果为是,则执行S7018;如果判断结果为否,则执行S7019;

S7018:获取listTasks列表第一个元素,根据此元素的包名信息获取到启动应用的Intent:如果是桌面应用,则取出listTasks列表第一个元素,这时listTasks列表已经将桌面应用过滤掉了,所以此元素对应的应用肯定不是桌面应用。然后根据此元素的包名信息,通过PackageManager包管理的getLaunchIntentForPackage()方法,得到对应的启动应用所需启动Intent。继续执行S7020;

S7019:获取listTasks列表第二个元素,根据此元素的包名信息获取到启动应用的Intent:判断如果不是桌面应用,则此时listTasks列表第一个元素和过滤桌面应用之前的列表的第一个元素是同一个元素。这时需要取出listTasks列表第二个元素作为切换的目标,因为这个元素是最新的后台应用。然后根据此元素的包名信息,通过PackageManager包管理的g etLaunchIntentForPackage()方法,得到对应的启动应用所需启动Intent。继续执行S7020;

S7020:根据启动应用的Intent,调用Context的startActivity方法启动此后台进程:根据不同的情况获取到启动应用的Intent,调用Context的startActivity方法启动此后台进程,而前台进程将变成最新的后台进程。

S7021:判断startActivity方法执行是否有异常发生:在执行切换过程中存在有发生异常的情况,所以需要使用java的try-catch机制保证对异常进行捕获,然后进行处理。如果判断结果为有异常,则执行S7022,如果判断结果为无异常,则执行S7023;

S7022:如果发生异常情况,则提示用户“无可切换应用”。

S7023:未发生异常,可以认为切换成功;可以看到最新的后台进程变成前台进程,而前台进程切换到后台,成为最新的后台进程。

S7024:函数退出,结束:切换执行完成,退出切换函数。

通过以上图5-1,5-2,6-1,6-2,7-1,7-2所述的详细方案,实现了A ndroid所有系统版本(Android5.0以下,Android5.0,Android5.0以上全系统版本覆盖)获取最新的后台应用以及切换到前台的方法,用户可以通过不同系统的不同方法反复调用,就可以实现最新的后台应用和前台应用的相互切换,从而为在Android系统上,实现最新的后台应用和前台应用相互快速切换提供了一套解决方案。

根据本发明的一个优选实施方式,Android 5.0以下机器可以通过ge tRunningTasks()方法替代getRecentTasks()方法来获取当前运行的应用,getRunningTasks()方法可以返回一个List<RunningTaskInfo>列表,这个列表是一个包含了当前正在运行的任务栈的列表,列表项RunningTaskIn fo保存了每一个应用的信息,可以得到当前列表最顶层的元素,然后通过topActivity属性可以得到当前应用的正在运行的类名,从而可以将其启动起来,实现切换功能。

根据本发明的另一个优选实施方式,还可以通过其他方式实现最近后台应用和前台应用的切换,例如双击,三击或者长按点击悬浮窗按钮来实现。还可以通过单击悬浮窗按钮展开一个悬浮窗口,在悬浮窗口中设置一个按钮,通过点击按钮的方法也可以切换最近后台应用和前台应用,但是多了一个操作步骤,不如直接操作按钮方便和快捷。

通过悬浮窗按钮实现最新的后台应用和前台应用两者的快速切换,悬浮窗按钮可以于悬浮任何窗口之上,用户可以在任何程序中进行操作,节省不必要的环节,节省用户时间;其次,通过实施发明只保证两个应用的切换,和其他应用没有关系,可以保证在有限的内存下,实现常用的两个应用进行快速切换;将后台程序进行了过滤,将桌面应用去掉,不会导致桌面应用和普通应用的切换,从而使用户避免产生切换上的错觉。因为普通用户不会把桌面当作应用看待,如果当前进入到了桌面,用户会以为应用退出了;通过调用系统对外提供的后台运行的进程方法来获得的后台信息,并通过直接还原后台任务栈中的程序来实现的,不会退出当前应用,然后进入桌面,启动另一个应用,减少了切换场景,避免消耗更多的系统内存等资源;最后,此功能通过单击悬浮窗按钮的方法来实现,使功能可以快速,便捷的得到响应,符合大多说用户的操作习惯,提高了用户对此应用的用户体验度。

以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1