使用showInputMethodPicker()更改后,Android输入法不会隐藏

使用showInputMethodPicker()更改后,Android输入法不会隐藏,android,android-intent,input,service,keyboard,Android,Android Intent,Input,Service,Keyboard,嗨,伙计们,我正在开发一个应用程序,它可以提高使用密码时的安全性。几个月以来我一直在做这件事,我需要你的帮助 我已经创建了一个新的InputMethodService。我希望仅在应用程序打开时才允许访问此输入。应用程序由密码保护,并在一个时间限制后关闭。 为了知道应用程序是否使用finish关闭,应用程序从输入服务发送一个intent,如果正在运行,则发送布尔值true;如果未运行,则发送布尔值false。 在检查密码后,当我的应用程序打开时,会发送以下意图之一: MyApplication.j

嗨,伙计们,我正在开发一个应用程序,它可以提高使用密码时的安全性。几个月以来我一直在做这件事,我需要你的帮助

我已经创建了一个新的InputMethodService。我希望仅在应用程序打开时才允许访问此输入。应用程序由密码保护,并在一个时间限制后关闭。 为了知道应用程序是否使用finish关闭,应用程序从输入服务发送一个intent,如果正在运行,则发送布尔值true;如果未运行,则发送布尔值false。 在检查密码后,当我的应用程序打开时,会发送以下意图之一:

MyApplication.java:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Some stuff 
    // Ask password result
    if (requestCode == 10) { 
        if (resultCode == 10) { //password ok
            //Some stuff
            Intent i = new Intent(mContext, PasswordsKeyboard.class);
            i.putExtra("appOpen", true);
            startService(i);
        } else {
            Intent i = new Intent(mContext, PasswordsKeyboard.class);
            i.putExtra("appOpen", false);
            startService(i);
            finish();
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
    //Some stuff 
    Intent i = new Intent(mContext, PasswordsKeyboard.class);
    i.putExtra("appOpen", false);
    startService(i);
    super.onDestroy();
}
最后一个在应用程序进入onDestroy时发送:

MyApplication.java:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Some stuff 
    // Ask password result
    if (requestCode == 10) { 
        if (resultCode == 10) { //password ok
            //Some stuff
            Intent i = new Intent(mContext, PasswordsKeyboard.class);
            i.putExtra("appOpen", true);
            startService(i);
        } else {
            Intent i = new Intent(mContext, PasswordsKeyboard.class);
            i.putExtra("appOpen", false);
            startService(i);
            finish();
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
    //Some stuff 
    Intent i = new Intent(mContext, PasswordsKeyboard.class);
    i.putExtra("appOpen", false);
    startService(i);
    super.onDestroy();
}
为了捕捉这些意图,我在InputMethodService中有一个onStart命令:

MyInputMethodeService.java:

public int onStartCommand(Intent intent, int flags, int startId) {
    boolean myBool= false;
    try {
       myBool= intent.getBooleanExtra("appOpen", false);
    } catch (Exception e) {
    }
    isAppOpen.edit().putBoolean("appOpen", myBool).commit();
    return super.onStartCommand(intent, flags, startId);
}
这段代码可以工作,但我在使用自定义键盘时遇到了一个很大的问题。当我选择键盘时,它会出现并正常工作。当我想使用Space和showInputMethodPicker方法使其消失时,问题就出现了

无论我做什么,键盘在屏幕上都是可见的。如果选择其他键盘,我会看到它显示在自定义键盘下方。当我使用home或back按钮时,没有任何变化,我的键盘仍在屏幕上。 如果我不使用showInputMethodPicker并直接使用home按钮,键盘将正常消失

我很确定他们的问题与我的startService调用有关,因为当我评论他们时,错误不会发生


任何帮助都将不胜感激!谢谢大家!

好了,伙计们,我找到了解决办法

那是愚蠢的,但我只需要写一个自我;在onstart命令中

这是修改后的代码

public int onStartCommand(Intent intent, int flags, int startId) {
boolean myBool= false;
try {
   myBool= intent.getBooleanExtra("appOpen", false);
 } catch (Exception e) {
}
isAppOpen.edit().putBoolean("appOpen", myBool).commit();
stopSelf();
return super.onStartCommand(intent, flags, startId);
}

我认为startService会启动,或者不管我在堆栈上的输入方法是什么,但我仍然看不出问题出在哪里。