进入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. 在AndroidStudio中引用jni的时候出错
  2. android自动化测试框架
  3. android 中 LocalSocket的基本使用方法
  4. Android(安卓)中 ThreadLocal使用示例
  5. Android(安卓)CountDownTimer倒计时器的使用
  6. [Android]解决failed to get the required ADT version from sdk
  7. mac上Android(安卓)Studio中adb的环境变量配置
  8. Android环境变量设置
  9. android 环境变量配置,以及sdcard配置

随机推荐

  1. 动态调整Android(安卓)surfaceView 视图
  2. Android(安卓)Studio 使用技巧(4)
  3. android 浏览普通彩信列表demo 核心源码
  4. Android之简易电话 & 短信
  5. Android复习(九)
  6. sd卡相关
  7. android保存图片到图库
  8. Android(安卓)NoTitle 不显示标题
  9. android console 常见信息
  10. android 小米时钟的实现