Android点击事件被丢弃的类型与原因

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Android点击事件被丢弃的类型与原因

InputDispatcher处理点击事件是单线程串行处理的如果队列前面的点击事件一直无法处理会导致后续点击事件迟迟无法响应给用户的感知就是手机卡顿所以在一些场景下InputDispatcher必须丢弃一些未处理完成的点击事件。
DropReason枚举完整地描述了点击事件被丢弃的所有原因

  • DROP_REASON_POLICY某些输入事件具有系统级的功能例如HOME键、电源键、电话接听/挂断键等被系统处理因此DispatcherPolicy不希望这些事件被窗口所捕获。当InputDispatcher在将输入事件放入派发队列前向DispatcherPolicy询问此事件的派发策略时DispatcherPolicy会将POLICY_FLAG_PASS_TO_USER策略去掉。没有这个派发策略的对象会被丢弃。
  • DROP_REASON_APP_SWITCHdispatchOnceInnerLocked函数说明了InputDispatcher的事件派发是串行的。因此在前一个事件的派发成功并得到目标窗口的反馈前后续的输入事件都会被其阻塞。当某个窗口因程序缺陷而无法响应输入时懊恼的用户可能会尝试使用HOME键退出这个程序。然而遗憾的是由于派发的串行性用户所按的HOME键在其之前的输入事件成功派发给无响应的窗口之前无法获得派发的机会因此在ANR对话框弹出之前的5秒里用户不得不面对无响应的应用程序欲哭无泪。为了解决这个问题InputDispatcher为HOME键设置了限时派发的要求。当InputDispatcher的enqueueInboundEventLocked函数发现HOME键被加入派发队列后便要求HOME键之前的所有输入事件在0.5秒由APP_SWITCH_TIMEOUT常量定义之前派发完毕否则这些事件将都会被丢弃使得HOME键至少能够在0.5秒内得到响应。
  • DROP_REASON_BLOCKED和APP_SWITCH原因类似如果是因为一个窗口无法响应输入事件用户可能希望在其他窗口上进行点击以尝试是否能得到响应。因为派发的串行性这次尝试会以失败而告终。为此当enqueueInboundEventLocked发现有窗口正阻塞着派发的进行并且新入队的触摸事件的目标是另外一个窗口则将这个新事件保存到mNextUnblockedEvent中。随后的dispatchOnceInnerLocked会将此事件之前的输入事件全部丢弃使得用户在其他窗口上进行点击的尝试可以立刻得到响应。
  • DROP_REASON_DISABLED因为InputDispatcher被禁用而使得事件被丢弃。InputDispatchersetInputDispatchMode函数可以使得InputDispatcher在禁用、冻结与正常三种状态之间进行切换。禁用状态会使得所有事件被丢弃冻结将会使得dispatchOnceInnerLocked函数直接返回从而停止派发工作。InputDispatcher的这三种状态的切换由Java层的IMS提供接口由AMS和WMS根据需要进行设置。例如当手机进入休眠状态时InputDispatcher会被禁用而屏幕旋转过程中InputDispatcher会被暂时冻结。
  • DROP_REASON_STALE在dispatchOnceInnerLocked函数准备对事件进行派发时会先检查一下事件所携带的时间戳与当前时间的差距。如果事件过于陈旧10秒以上由常量STALE_EVENT_TIMEOUT所指定则此事件需要被抛弃。

参考

深入理解android卷三

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android