一种避免智能电视启动器出现anr的方法

文档序号:7780548阅读:381来源:国知局
一种避免智能电视启动器出现anr的方法
【专利摘要】一种避免智能电视启动器出现ANR的方法,监控系统中应用程序的启动器包名;根据系统中存在的所述启动器包名判断启动器是否在系统中启动,当启动器已启动,系统抛弃底层的按键事件;根据系统中存在的所述启动器包名判断启动器是否在系统中完成启动,当启动器启动完毕,系统恢复接收底层的按键事件。本发明方法通过设置系统属性来识别启动器的启动状态,当启动器处于启动状态时抛弃所有底层传来的按键事件,按键事件不传递给上层应用,以使应用程序在使用过程中对底层按键事件无法识别并不响应弹出对话框,当启动器启动完成后才修改系统属性以恢复底层按键事件的正常传递,有效解决了启动器启动过程中ANR事件的发生,改善了用户的使用体验。
【专利说明】—种避免智能电视启动器出现ANR的方法
【技术领域】
[0001]本发明涉及智能电视操作系统,尤其涉及一种避免智能电视启动器出现ANR的方法。
【背景技术】
[0002]目前,智能电视普遍采用Android操作系统作为操作平台,在Android平台上,如果智能电视应用程序有一段时间响应不够灵敏,系统会向用户显示一个提示应用程序无响应的对话框,这个对话框称为应用程序无响应(ANR Application Not Responding)对话框,用户可以选择等待让应用程序继续运行,也可以选择“强制关闭”。对于一个运行合理流畅的应用程序而言,系统提示ANR对话框给用户会带来不好的用户体验。
[0003]现有技术Android应用程序通常运行在一个单独的线程(如main)中,应用程序所做的事情如果在主线程中占用太多时间就会引发ANR对话框,因为应用程序没有机会自己处理输入时间或者Intent广播。可见,应用程序对响应性能的设计非常重要,这样系统才不会显示ANR对话框给用户。通常情况下,Android系统中Activity (Android中一个负责与用户交互的组件)的最长执行时间为5秒,Broadcast Receiver的最长执行时间为10秒,因此,运行在主线程里的任何方法都应该尽可能少做事情,特别是,Activity在它的关键生命周期方法(如onCreateO和onResumeO )里尽可能少的去做潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算(例如,改变位图尺寸),而应该在子线程中完成;同时,主线程应该为子线程提供一个Handler (Handler主要用于接受子线程发送的数据,并用此数据配合主线程更新界面),以便子线程完成时能够提交给主线程,这种方式设计应用程序,将能保证主线程保持对输入的响应并能避免5秒输入时间的超时引发ANR对话框。然而,通过这种方法来避免ANR对话框或者通过延长触发ANR对话框时间来避免也不可能完全避免ANR对话框现象的发生,在一些场景下,比如智能电视启动器在第一次启动的5?10秒的预加载过程中,用户频繁的按键输入可能会导致启动器加载过程中出现ANR对话框,影响用户的使用体验。
[0004]因此,现有技术还有待于改进和发展。

【发明内容】

[0005]鉴于上述现有技术的不足之处,本发明为解决现有技术的缺陷和不足,提出一种避免智能电视使用过程中出现ANR对话框现象的处理方法。
[0006]本发明解决技术问题所采用的技术方案如下:
一种避免智能电视启动器出现ANR的方法,包括如下步骤:
监控系统中应用程序的启动器包名;
根据系统中存在的所述启动器包名来判断启动器是否在系统中启动,当启动器已启动,系统抛弃底层的按键事件;
根据系统中存在的所述启动器包名来判断启动器是否在系统中完成启动,当启动器启动完毕,系统恢复接收底层的按键事件。
[0007]作为进一步的技术改进,所述监控系统中应用程序的启动器包名具体采用如下步骤:
所述应用程序的启动器在系统中启动时触发框架层启动Activity方法,从该Activity方法中查询将要启动的应用程序的启动器包名。
[0008]所述判断启动器是否在系统中启动采用设置启动器包名的系统属性来标识启动器是否在系统中启动。
[0009]所述判断启动器是否在系统中完成启动采用设置启动器包名的系统属性来标识启动是否在系统中完成启动。
[0010]作为改进的方案,所述判断启动器是否在系统中完成启动还包括采用在确定启动器已启动后,同时开启一启动计时器,经过计时器预定时间后启动器尚未在系统中完成启动时,系统设直启动器完成启动。
[0011]所述计时器预定时间为5?10秒。
[0012]与现有技术相比较,本发明方法采取在Android系统启动器程序启动时,通过设置系统属性来识别启动器是否正在启动中,当启动器处于启动状态时抛弃所有底层传来的按键事件,按键事件不会传递给上层应用,以使应用程序在使用过程中对底层按键事件无法识别并不响应弹出对话框,当启动器启动完成后才修改系统属性以恢复底层按键事件的正常传递,同时,还可以给启动器启动过程设置计时器来计算启动过程所花费的时间,超过一定的时间也可修改系统属性以恢复底层按键事件的正常传递。有效解决了启动器启动过程中ANR事件的发生,改善了用户的使用体验。
【专利附图】

【附图说明】
[0013]图1是本发明避免智能电视启动器出现ANR的方法优选实施例一的流程图。
[0014]图2是本发明避免智能电视启动器出现ANR的方法优选实施例二的流程图。
【具体实施方式】
[0015]为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0016]如图1所示,一种避免智能电视启动器出现ANR的方法优选实施例一的流程图,包括如下步骤:
S100,监控系统中应用程序的启动器包名。
[0017]对于采用Android系统的智能电视而言,Android系统应用程序的启动器在应用程序启动时,都会触发框架层启动Activity方法(ActivityStack.java中StartActivityLocked方法),通过监控该Activity方法,通过该Activity方法可以获取到将要启动的应用程序的启动器包名,包名是用来识别Android应用程序的。因此,可以通过对Activity方法中包含的启动器包名进行查询过滤后找出启动的应用程序。
[0018]S200,根据系统中存在的所述启动器包名判断启动器是否在系统中启动,当启动器已启动,系统抛弃底层的按键事件。[0019]根据步骤SlOO中查询到启动的应用程序后,根据启动器包名来设置该应用程序在系统中的属性,以识别应用程序是否处于启动状态,具体可以通过对ActivityStack.java中StartActivityLocked方法的框架层接口 SystemProperties.set来对启动器包名的系统属性进行设置,例如启动器包名为com.tcl.u1.qiyi时,将其属性值设置为I以标识启动器com.tcl.u1.qiyi正在启动中,查询过滤正在启动的应用程序及设置属性值的代码参考如下:
StartActivityLocked ()
if(^com.tcl.ui 〃.equals (alnf0.applicationlnf0.packageName)) / {
//设置系统属性com.tcl.u1.qiyi为I
SystemProperties.set(〃com.tcl.u1.qiyi〃,〃1〃)
}
然后,需要在Android框架层按键策略方法(PhoneWindowManager.java的interceptKeyBeforeDispatch方法)中来检测应用程序的属性,当应用程序的属性,即启动器包名的属性,为I时,表明启动器com.tcl.u1.qiyi正在启动中,这时,需要抛弃底层传来的按键事件,抛弃底层传来的按键事件是确保应用程序在启动过程中不受外部按键事件的影响,避免用户对应用程序启动过程的按键干扰,避免ANR对话框的出现。当启动器com.tcl.u1.qiyi返回给系统的属性值为I时,系统则返回-1值,表明抛弃按键事件,则不将按键事件传递给上层应用。
[0020]S300,根据系统中存在的所述启动器包名来判断启动器是否在系统中完成启动,当启动器启动完毕,系统恢复接收底层的按键事件。
[0021]当Android应用程序在启动完成后会触发框架层的通知系统应用程序启动完成(通过ActivityRecord.java中`的windowsDraw方法通知),通知也是采用对启动器包名进?Τ过滤来查找完成启动的启动器,如果启动器完成启动,则将启动器包名的系统属性回复,例如,通过框架层接口 SystemProperties.set ( “com.tcl.u1.qiyi ”),“O”)来对启动器com.tcl.u1.qiyi进行系统属性值的设置,将其属性值设置为0,标识启动器com.tcl.u1.qiyi启动完成,之后,若有按键事件经过Android框架层按键策略方法时,由于系统属性值已经被设置为完成状态,因此,按键事件可以恢复正常传递给相应的应用程序,这样,对启动器在启动期间对底层按键事件抛弃,在启动器启动完成后恢复底层按键事件的正常传递,使得用户在启动器启动期间的按键事件无法正常传递给上层应用程序,系统也就无法在启动器启动期间接收响应按键事件出现ANR对话框,有效解决了启动器在启动期间ANR事件的发生。
[0022]作为改进方案,本发明还提供优选实施例二进一步完善优选实施例一的技术方案,保证系统能够及时恢复对按键事件的响应,避免用户误认为系统死机的情况发生。
[0023]图2所示为本发明优选实施例二的流程图,基于优选实施例一方案的基础,当判断启动器启动的同时,设置一个计时器,经过计时器预定时间后启动器尚未在系统中完成启动时,系统设置启动器完成启动,以保证系统能够及时恢复对按键事件的响应。具体步骤说明如下:
S101,监控系统中应用程序的启动器包名;该步骤具体实现过程与步骤SlOO相同,此处不赘述。[0024]S201,根据系统中存在的所述启动器包名来判断启动器是否在系统中启动,当启动器已启动,同时开启计时器,系统抛弃底层的按键事件。
[0025]该步骤与步骤S200中判断启动器是否在系统中启动的过程相同,同时当启动器启动时需要开启一计时器进行计时,该计时器计时的预定时间为启动器在系统中加载的时间,一般为5~10秒,设置计时器计时是保证一定时间内启动器如果未启动完成时,系统也可以恢复接收底层的按键事件,使按键事件正常传递给应用程序,避免用户认为系统无响应进入死机状态而影响用户的体验。
[0026]在ActivityStack.java的StartActivityLocked方法中将系统属性设置为启动器正在启动的同时开启计时器:
//10秒钟后触发mUIDisplayed来设置系统属性com.tcl.u1.qiyi为O mHandler.postDelayed(mUIDisplayed, 10*1000);
S301,根据系统中存在的所述启动器包名来判断启动器是否在系统中完成启动,当启动器启动完毕或计时器预定时间到时,系统恢复接收底层的按键事件。
[0027]判断启动器是否在系统中完成启动与步骤S300相同,此处不赘述。而无论启动器是否启动完毕,如果计时器预定时间到时,系统均需要恢复接收底层的按键事件,保证按键事件可以正常传递给上层应用程序。
[0028]对于计时器到时的触发,可在ActivityStack.java中定义一个Runnable参数来进行,代码说明如下:
Il定义一个Runnable用来在计时器时间到达时触发
Runnable mUIDisplayed = new Runnable () {
public void run() {
Il计时器时间到达时将启动器com.tcl.u1.qiyi系统属性设置为OSystemProperties.set (〃com.tcl.u1.qiyi〃,〃0〃);

}
当计时器到达预定时间时,通过对Runnable参数的识别来设置启动器com.tcl.u1.qiyi的系统属性,从而使系统在计时器到时而启动器未完成启动时也能够恢复接收底层的按键事件。
[0029]应当理解的是,以上所述仅为本 发明的较佳实施例而已,并不足以限制本发明的技术方案,对本领域普通技术人员来说,在本发明的精神和原则之内,可以根据上述说明加以增减、替换、变换或改进,而所有这些增减、替换、变换或改进后的技术方案,都应属于本发明所附权利要求的保护范围。
【权利要求】
1.一种避免智能电视启动器出现ANR的方法,其特征在于,包括如下步骤: 监控系统中应用程序的启动器包名; 根据系统中存在的所述启动器包名来判断启动器是否在系统中启动,当启动器已启动,系统抛弃底层的按键事件; 根据系统中存在的所述启动器包名来判断启动器是否在系统中完成启动,当启动器启动完毕,系统恢复接收底层的按键事件。
2.根据权利要求1所述的避免智能电视启动器出现ANR的方法,其特征在于,所述监控系统中应用程序的启动器包名具体采用如下步骤: 所述应用程序的启动器在系统中启动时触发框架层启动Activity方法,从该Activity方法中查询将要启动的应用程序的启动器包名。
3.根据权利要求1所述的避免智能电视启动器出现ANR的方法,其特征在于,所述判断启动器是否在系统中启动采用设置启动器包名的系统属性来标识启动器是否在系统中启动。
4.根据权利要求1所述的避免智能电视启动器出现ANR的方法,其特征在于,所述判断启动器是否在系统中完成启动采用设置启动器包名的系统属性来标识启动是否在系统中完成启动。
5.根据权利要求4所述的避免智能电视启动器出现ANR的方法,其特征在于,所述判断启动器是否在系统中完成启动还包括米用在确定启动器已启动后,冋时开启一启动计时器,经过计时器预定时间后启动器尚未在系统中完成启动时,系统设直启动器完成启动。
6.根据权利要求5所述的避免智能电视启动器出现ANR的方法,其特征在于,所述计时器预定时间为5?10秒。
【文档编号】H04N21/443GK103702191SQ201310685853
【公开日】2014年4月2日 申请日期:2013年12月16日 优先权日:2013年12月16日
【发明者】霍平华 申请人:Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1