输入法相关知识点

关键字

adb logcat | grep -iE "HwInputMethodManagerService|SecInputMethodManagerService
|InputMethodManagerService|InputEvent|WindowManager|HwIME_Pro|WindowManager_visibility"
----输入法莫名弹出

一般情况下,输入法显示都是由于应用进程调起输入法导致输入法显示,而非输入法主动显示

  1. 通过焦点切换确定时间点【FocusChange】
  2. 查看输入法由谁调出【InputMethodManager】
 ## log关键词
inputMethodManager|FocusChange
 adb logcat | grep -iE "inputMethodManager|FocusChange"
//备忘录调起输入法
09-24 15:44:42.712  1423  2073 I HwAftPolicyService: handleFocusChange focusPid=0, focusWindowTitle:null
09-24 15:44:42.891 23064 23064 I ViewRootImpl[NotePadActivity]: windowFocusChanged: hasFocus false inTouchMode true
09-24 15:44:42.918  1423  2073 I HwAftPolicyService: handleFocusChange focusPid=23064, focusWindowTitle:com.huawei.notepad/com.example.android.notepad.NoteEditor
09-24 15:44:43.045 23064 23064 W InputMethodManager: startInputReason = 1
09-24 15:44:44.961 23064 23064 I InputMethodManager: showSoftInput     
## 通过focuschange 推动调起输入法的时间,接下来全局搜索23064进程号代表进程
##  确定是谁掉起的

----输入法无法弹出
  • 无法弹出需要诊断是否是调用了showsoftInput之后仍无法弹出

    • 未走入到showsoftInput中-------为对应载体的问题

    分析思路

    1. 主要查看点击的时间点【inputEvent】与输入法调出的时间点【InputMethodManager】间隔
    2. 判断是否输入法问题
    log关键字
    InputMethodManager|inputEvent|FocusChange
    
    案例:王者荣耀里面,点击文字输入框,点了好几次才弹出软键盘,不是很灵敏
    分析过程:
    1.用户无效点击时间为21.38.48---21.38.50.027
    2.直到切换焦点activity到SGameActivty上后,才调用输入法的showSoftInput
    结论:
    王者荣耀中,输入法调起不是由点击事件发起,而是由应用程序主动调起
    因此输入法多次点击无法弹出,实际上是由于应用调用输入法之前出现延迟,为应用端问题。
    
----输入法莫名隐藏

主要由几种方式

  • 应用程序调用hidesoftinput,导致输入法面板隐藏------》对应应用
  • 全面屏手势触发,导致输入法隐藏-----》手势导航
  • 焦点切换导致输入法隐藏—》焦点切换到应用
  • 输入法crash导致崩溃面板消失-----》

分析思路

  1. 输入法隐藏标志【InputMethod EXITING】

  2. 用户操作位置【InputEvent】

  3. 输入法框架调用【InputMethodManager】

  4. 手势导航调用【interceptKeyBeforeQueueing:key】

  5. 切换应用时间点找出之前的应用【FocusChange】

    log关键字
    InputMethod EXITING|InputEvent|InputMethodManager|interceptKeyBeforeQueueing:key|FocusChange
    

输入法知识点

----输入法框架(IMF)
  • IMF(包括三个主要的部分)

    • 输入法服务:inputMethodManager(IMM)

      • 概念:管理各部分的交互,是一个客户端的API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统化
        服务,可通过COntext.getSystemService()来获取一个InputMethodManager的实例。
        
    • 输入法应用:InputMethod(IME)

      • 概念:实现允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法合适隐藏或者显示
        它的UI。同一时间只能有一个IME运行。
        
    • 客户端:Client Application

      • 概念:通过输入法管理器控制焦点和IME的状态,一次只能有一个客户端使用IME.
        
----结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn2ojlT4-1664770844667)(模块知识点图片/输入法结构图.png)]

----IMMS的实现
InputMethodManagerService.java 是整个文档中,一切与输入法相关的总控制中心。它通过管理下面三个模块来实现系统的输入法框架
  • WindowManagerService
    • 负责显示输入法,接受用户事件
  • InputMethodService
    • 输入法内部逻辑,键盘布局,选词等,最终把选出的字符通过commitText提交出来。
  • InputMethodManager
    • 由UI控件(View,TextView,EditText等)调用,用来操作输入法。比如,打开关闭,切换输入法等。

正常案例

----备忘录调起输入法
09-24 15:06:50.765 23064 23064 I InputEvent: (372,828):(372,828)0-1-0  ##下发事件
09-24 15:06:50.772 23064 23064 I InputEvent: Moving, count=1
09-24 15:06:50.813 23064 23064 I InputEvent: (372,828):(372,828)1-1-0
09-24 15:06:50.816  1423  2685 V SecInputMethodManagerService: Client requesting input be hidden, pid=10047
09-24 15:06:50.816  1423  2685 I HwInputMethodManagerService: showinput: hide secure input mIsNeedWaitShow = false
09-24 15:06:50.816  1423  2685 V InputMethodManagerService: Client requesting input be shown, requestedUid = 10047
09-24 15:06:50.816  1423  2685 D InputMethodManagerService: showCurrentInputLocked: mCurToken=android.os.Binder@e747ced    ##  不同输入法的token值不一样
09-24 15:06:50.824  1423  7376 D InputMethodManagerService: onInputShow  ## IMMS向IME下发显示输入法
09-24 15:06:50.826  7383  7383 I HwIME_Pro: ImeService>>>onStartInputViewInternal
09-24 15:06:50.834  7383  7383 I HwIME_Pro: ImeService>>>setCandidatesViewShown:true
09-24 15:06:50.834  7383  7383 I HwIME_Pro: java.lang.Throwable
09-24 15:06:50.834  7383  7383 I HwIME_Pro: 	at com.baidu.input_huawei.ImeService.setCandidatesViewShown(Proguard:6716)
09-24 15:06:50.842  7383  7383 I HwIME_Pro: ImeService>>>onWindowShown     ##显示输入法空白界面
09-24 15:06:50.843  1423  6022 I InputMethodManagerService: showImePostLayout token = android.os.BinderProxy@4562325
09-24 15:06:50.852  1423  7677 I WindowManager: updateFocusedWindowLocked: changed =false displayId=0 topFocusedDisplayId=-1 shouldSleep=false newFocus=Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} calls=com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6594 com.android.server.wm.WindowManagerService.relayoutWindow:2948 com.android.server.wm.Session.relayout:215 android.view.IWindowSession$Stub.onTransact:918 com.android.server.wm.Session.onTransact:141 android.os.Binder.execTransactInternal:1161 android.os.Binder.execTransact:1130 <bottom of call stack> 
09-24 15:06:50.869  1423  2081 I WindowManager: performshow Window{a09b7de u0 InputMethod} tok.waitingToShow=false isTransitionSet=false parentHidden=false vis=0 tok.isVisible=false hasSurface=true policyVis=true destroying=false animating=false
09-24 15:06:50.872  1423  2081 I WindowManager: performshow Window{a09b7de u0 InputMethod} tok.waitingToShow=false isTransitionSet=false parentHidden=false vis=0 tok.isVisible=false hasSurface=true policyVis=true destroying=false animating=false
09-24 15:06:50.882  1423  6022 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.883  1423  7677 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.887  1423  7677 I WindowManager: reportResized : win = Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} drawState = HAS_DRAWN
09-24 15:06:50.888  1423  7677 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.889  1423  2075 I WindowManager: vis:a018,appearance:1000,isFullscreen:true,win:Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor}
09-24 15:06:50.896  1423  2079 I WindowManager: updateFocusedWindowLocked: changed =false displayId=0 topFocusedDisplayId=-1 shouldSleep=false newFocus=Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} calls=com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6594 com.android.server.wm.DisplayContent.layoutAndAssignWindowLayersIfNeeded:4043 com.android.server.wm.WindowManagerService$H.handleMessage:6087 android.os.Handler.dispatchMessage:109 android.os.Looper.loop:228 android.os.HandlerThread.run:67 com.android.server.ServiceThread.run:44 <bottom of call stack> 
09-24 15:06:50.899  1423  2079 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a01
09-24 15:17:07.232  1423  7376 D InputMethodManagerService: onInputHide  ## IMMS向IME下发显示输入法
09-24 15:17:07.234  7383  7383 I HuaweiIME: 	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9526)
09-24 15:17:07.234  7383  7383 I HuaweiIME: 	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9428)
09-24 15:17:07.234  7383  7383 I HuaweiIME: 	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9381)
09-24 15:17:07.234  7383  7383 I HuaweiIME: 	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9775)
09-24 15:17:07.234  7383  7383 I HuaweiIME: 	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:271)
09-24 15:17:07.234  7383  7383 I HwIME_Pro: ImeService>>>onWindowHidden   ## IME显示输入法界面
09-24 15:17:07.239  1423  6671 V InputMethodManagerService: hideMySoftInput, pid=7383, token=android.os.Binder@e747ced
09-24 15:17:07.241  7383  7383 I UserTrack: HandleFKey:filename=InputEventHandler.java,line=1242,args=[8]

案例分析

----华为键盘与华为安全键盘切换时,会发现闪
华为安全输入法和普通输入法是两个服务,根据输入法的不同类型来启动不同的输入法。
【问题根因】:输入法google设置的是一个输入法服务,在输入法隐藏的时候两者回调走不同的路线。在输入法切换的时候输入框的焦点
切换focusln和focusOut是同时发出的,存在focusln先达到,而后focusOut后达到,前者发起显示的首后者才开始了隐藏,
导致了输入法显示又消失的现象。但是此时并没有改变任何的状态。所有不会影响冲走的的业务
【解决计划】:CCB挂起处理

**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值