最近在状态栏上面添加了一些系统常用的按键,用的比较多的,Home, Menu, Back三个按键,
分别模拟物理按键按下时的消息,
参考下面两篇文章,可以实现在状态栏上添加自定义的按键,
1.
在android的状态栏(statusbar)中增加menu,home和back快捷键的方法
http://blogold.chinaunix.net/u2/78893/showart_2349971.html
2.
在android的状态栏(statusbar)中增加menu,home和back快捷键的方法,及按键延迟原因分析
http://hi.baidu.com/tigerpan/blog/item/63caae81b57580b16c811937.html
但是在状态栏上面点击按钮的时候,却经常出现死锁,假死的情况,在第二篇文章的时候,提到,
我们先看一下执行流程
在com.android.server.WindowManagerService.injectKeyEvent(KeyEvent, boolean)函数中我们可以看到实际上是调用dispatchKey(newEvent, pid, uid)函数,这个dispatchKey函数中:
需要先找到当前的焦点focusObj(focusObj:WindowState 就是在维护窗口ViewRoot与WindowManagerService之前的关联,这二者的通信都在WindowState中可以找到);再用focusObj把KeyEvent传递给当前焦点窗口。但在传递之前会先调用mKeyWaiter.waitForNextEventTarget()函数等待当前焦点处理完上一次事件(这包括KeyEvent,MotionEvent...等),如何判断是否处理完上一次事件, 用if (mFinished && !mDisplayFrozen) if (targetWin != null)这两个if语句判断,而最关键就是这个mFinished ,这里还得查看ViewRoot,在ViewRoot中分发事件后会调用sWindowSession.finishKey(mWindow);告诉WindowManagerService,在doFinishedKeyLocked()函数中将mFinished = true,如果mFinished不为true,则会wait(curTimeout),这就是出现停顿的直接原因
通过打印Log显示是我们的KeyEvent.Action_Down事件一直不能mFinished,这就要跟踪ViewRoot,发现每次在模拟的KeyEvent.Action_Down事件的Message根本不能被处理,原因是StatusBarView的TouchEvent没有处理完成,并且与模拟的KeyEvent.Action_Down事件在MessageQueue的next函数中卡住了而ViewRoot本身就是一个Handler,大量的Message从此经过,而StatusBar的ViewRoot既要处理Touch事件也要处理模拟按键,就出现了这种竞态死锁的现象。
延迟发送模拟的KeyEvent是我目前采用的解决方式,上面的例子中sendKey函数已经体现
大概就是按键点击的时候(我自己个人理解),如果在onClick事件里面立刻直接发送KeyEvent的话,会导致onClick的消息处理无法正常返回,从而导致后面的消息也无法被获取处理,这是产生假死停顿的原因,所以参考上面的方法,新创建一个线程,延时发送KeyEvent(我直接用文2的方法问题也没有得到很好的解决).
分享到:
相关推荐
ORACLE表死锁的解决方法亲测有效!
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
操作系统之--模拟银行家算法实现死锁避免
设计模拟实现死锁避免的程序,要求: 1,输入并显示资源类型数,进程数,每类资源的个体数; 2,输入每个进程对每类资源的最大需求量,已分量,算出其剩余需求量。算出系统每类资源的当前剩余量;显示输入和计算出的...
课程设计-模拟银行家算法避免死锁.doc
对于死锁的一个充分模拟技术,能够模拟死锁的问题而写
本文举例说明SQL Server死锁产生的原因,并提出了解决的办法。
遇到ANR(Application Not Responding)是比较常见的问题,产生ANR的原因有很多,比如CPU使用过高、事件没有得到及时的响应、死锁等,下面将通过一次因为死锁导致的ANR问题,来说明如何通过trace文件分析ANR问题
本文将要为您介绍的是MSSQL死锁产生原因及解决方法,教程操作方法: 一、 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去....
mysql死锁解决
java线程实践,了解线程死锁,同步问题
仿真模拟银行家算法对死锁的避免。 所谓安全状态是指系统能按某种进程顺序,来为每个进程pi分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个序列,则系统...
实测有效的一个c++检测线程死锁的解决方法(实现和测试代码) 原创实测有效的一个c++检测线程死锁的解决方法,已应用于项目,实测有效 原创文章地址:https://blog.csdn.net/liaozhilong88/article/details/80354414...
db2死锁问题分析及解决方案,可以快速解决数据库问题。
主要介绍了java中常见的死锁以及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...
Java源码房门终于被打开了(解决死锁的方法).rar
oracle数据库解决死锁,使用plsql语句手动解决死锁问题
本次课程设计的内容是采用银行家算法,编写和调试一个仿真模拟银行家算法避免死锁的程序。设计n个并发进程共享3类不同的系统资源,即1类资源、2类资源、3类资源。进程可以动态的申请资源,系统按各个进程的申请动态...
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。...三、死锁的定位方法 通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。