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

时间:2014-10-28 21:35:54

标签: android android-intent input service keyboard

大家好我正在开发一个在使用密码时提高安全性的应用程序。几个月以来我一直在努力,我希望得到你的帮助。

我创建了一个新的InputMethodService。我想仅在应用程序打开时才允许访问此输入。该应用程序由密码保护,并在时间限制后关闭。 为了知道应用程序是否已关闭(使用finish()),从输入服务中,应用程序向InputMethodService发送一个具有布尔值的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);
}

当应用程序进入onDestroy()时发送最后一个:

MyApplication.java:

@Override
protected void onDestroy() {
    //Some stuff 
    Intent i = new Intent(mContext, PasswordsKeyboard.class);
    i.putExtra("appOpen", false);
    startService(i);
    super.onDestroy();
}

为了捕获这些意图,我在InputMethodService中有一个onStartCommand:

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()方法使它消失时,问题出现了。

无论我做什么,键盘仍然可以在屏幕上看到。如果我选择不同的键盘,我会看到它出现在我的自定义键盘下方。当我使用主页或后退按钮时,没有任何变化,我的键盘仍在屏幕上。 如果我不使用showInputMethodPicker(),我直接使用主页按钮,键盘正常消失..

我很确定他们的startService()调用存在问题,因为当我评论它们时,错误不会发生。

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。

那是愚蠢的,但我只需写一个stopSelf();在onStartCommand()...

这是修改过的代码。

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);
}