进入InputMethodManager类的doStartInput方法

    void doStartInput(InputConnection ic, EditorInfo attribute, boolean restarting) {        if (!restarting) {            doFinishInput();        }        mInputStarted = true;        mStartedInputConnection = ic;        mInputEditorInfo = attribute;        initialize();        if (DEBUG) Log.v(TAG,"InputMethodService class" +  "CALL: onStartInput , mWindowVisible=" + mWindowVisible);        onStartInput(attribute, restarting);        if (mWindowVisible) {            if (mShowInputRequested) {                if (DEBUG) Log.v(TAG,"InputMethodService class" +  "CALL: onStartInputView");                mInputViewStarted = true;                onStartInputView(mInputEditorInfo, restarting);                startExtractingText(true);            } else if (mCandidatesVisibility == View.VISIBLE) {                if (DEBUG) Log.v(TAG,"InputMethodService class" +  "CALL: onStartCandidatesView");                mCandidatesViewStarted = true;                onStartCandidatesView(mInputEditorInfo, restarting);            }        }    }

从上面来看mWindowVisible这个变量就是开关,那么我们来看下,这个变量是什么时候true的呢?即上面时候才让它show的呢?

找到两处赋值的地方,如下:

   void showWindowInner(boolean showInput) {        boolean doShowInput = false;        boolean wasVisible = mWindowVisible;        mWindowVisible = true;
    public void hideWindow() {        finishViews();        mImm.setImeWindowStatus(mToken, 0, mBackDisposition);        if (mWindowVisible) {            mWindow.hide();            mWindowVisible = false;            onWindowHidden();            mWindowWasVisible = false;        }    }

我们看下showWindowInner在什么地方被调用

    public void showWindow(boolean showInput) {        if (DEBUG) Log.v(TAG,"InputMethodService class" +  "Showing window: showInput=" + showInput                + " mShowInputRequested=" + mShowInputRequested                + " mWindowAdded=" + mWindowAdded                + " mWindowCreated=" + mWindowCreated                + " mWindowVisible=" + mWindowVisible                + " mInputStarted=" + mInputStarted);                if (mInShowWindow) {            Log.w(TAG,"InputMethodService class" +  "Re-entrance in to showWindow");            return;        }                try {            mWindowWasVisible = mWindowVisible;            mInShowWindow = true;            showWindowInner(showInput);        } finally {            mWindowWasVisible = true;            mInShowWindow = false;        }    }

        public void showSoftInput(int flags, ResultReceiver resultReceiver) {            if (DEBUG) Log.v(TAG,"InputMethodService class" +  "showSoftInput()");            boolean wasVis = isInputViewShown();            mShowInputFlags = 0;            if (onShowInputRequested(flags, false)) {            if (DEBUG) Log.v(TAG,"InputMethodService class" +  "showWindow(true)");                showWindow(true);            }

从上面来看,它的确是传了个true,showWindow(true);那么什么时候才周到这里呢?看了下日志,如下:

01-01 09:22:22.520 V/PateoInputMethod( 1486): InputMethodService classshowSoftInput()
01-01 09:22:22.520 V/PateoInputMethod( 1486): InputMethodService classshowWindow(true)

可以看出是在show的时候进入该方法的,那就对了,好吧,有关怎么show的流程,可以看我写的另一个帖子:

 

android 点击输入框调出输入法流程分析


http://blog.csdn.net/jianguo_liao19840726/article/details/24413043



更多相关文章

  1. Android Service Bind启动调用service方法
  2. 【移动安全】Android App Smail代码动态跟踪调试方法
  3. Android方法过多MutiDex使用说明
  4. 修改 android 手机 hosts 文件的方法
  5. android 中 LocalSocket的基本使用方法
  6. android 取消标题 程序意外停解决方法
  7. Android删除Alarm的方法
  8. Android小项目之欢迎滑动页面(最简洁方法)

随机推荐

  1. Win10安装MySQL8压缩包版的教程
  2. mysql外键基本功能与用法详解
  3. mysql连接查询、联合查询、子查询原理与
  4. Mysql数据库设计三范式实例解析
  5. mysql数据类型和字段属性原理与用法详解
  6. 简单了解MYSQL数据库优化阶段
  7. Windows下MySQL主从复制的配置方法
  8. MySQL开启慢查询方法及实例
  9. MySQL5.6 GTID模式下同步复制报错不能跳
  10. mysql学习笔记之完整的select语句用法实