android外设input上报流程

viewrootimpl里面根据状态机的变化进入不同的stage,imeinputstage
Android应用程序获得键盘按键消息的四个过程分别是InputManager的启动、应用程序注册键盘消息接收通道、inputmanager分发键盘消息以及应用程序注销键盘消息接收通道。
InputManager的启动过程:systemserver里面初始化inputmanager调用nativeInit和start函数,在init函数的本地层会创建inputreader和inputdispatcher两个线程分别用于接收和发送input事件,start函数调用nativeStart和watchdog的addMonitor函数。看门狗的作用是每隔一端时间向管道里面写数据,因此inputreader就会处于唤醒状态,读取用户按键事件。

应用程序注册键盘消息接收通道的过程分析:在activity启动的handleResumeActivity函数的过程中,activityThread会通过WindowManagerImpl类为该Activity创建一个ViewRoot实例,并且会通过viewRoot类的setView成员函数把与该Activity关联的View设置到这个ViewRoot中去,而Activity正是通过ViewRoot类的setView成员函数来注册键盘消息接收通道的。
setView中注册键盘消息接收通道(InputChannel)相关的逻辑主要有三处,一是调用requestLayout,通知InputManager当前activity窗口是被激活的;二是调用sWindowSession(WindowManagerService内部类Session的远程接口)的add成员函数来把键盘消息接收通道的一端注册在InputManager中,三是调用InputQueue的registerInputChannel成员函数来把键盘消息接收通道的另一端注册在本应用程序的消息循环(Looper)中。
    应用程序注销键盘消息接收通道的过程分析:在activity窗口销毁时,它就会向InputManager注销前面注册的键盘消息接收通道。ViewRoot类中的mInputQueueCallback为null,表示由这个ViewRoot自己来管理键盘输入事件,因此,这里首先会调用InputQueue的unregisterInputChannel函数来注销注册在应用程序这一侧的Client端InputChannel,然后再调用sWindowSession的remove函数来注销注册在InputManager这一侧的Server端InputChannel,这个逻辑是和前面介绍应用程序注册键盘消息接收通道的逻辑相对应的,前面分别注册了这两个InputChannel,现在Activity要销毁了,当然就要把它们注销了。

input驱动上报数据过快丢失数据的解决方案:在创建设备的时候修改input_dev的hint_events_per_packet变量,这个函数接口是用于计算每个数据包的事件数目也就是input_event会被执行的次数,准备好大小合适的数据包buffer。默认在创建设备的时候是0,在第一次上报数据时初始化为64

你可能感兴趣的:(linux,android应用)