在Service中全局监听输入法意思就是可以在任何界面都可以监听输入法,不局限于自己的APP。
方法一:根据切换输入法会在通知栏显示通知实现
- 优点:简单高效
- 缺点:手机必须安装两个以上输入法
通常语言为中文的情况下切换输入法的通知栏标题有”选择输入法”,”更改键盘”,”选择键盘”,”更改输入法”这四种,在NotificationListenerService
onNotificationPosted(StatusBarNotification sbn)
onNotificationRemoved(StatusBarNotification sbn)
两个方法中分别检测该四个关键字就可以实现打开关闭输入法的监听。
public static List<String> sKeyboardTitleList = new ArrayList<>(Arrays.asList(new String[] {
"选择输入法","更改键盘","选择键盘","更改输入法"}));
public void onNotificationPosted(StatusBarNotification sbn) {
String title = sbn.getNotification().extras.getString("android.title");
if (title == null) return;
if(sKeyboardTitleList.contains(title)){
//输入法打开
}
}
public void onNotificationRemoved(StatusBarNotification sbn) {
String title = sbn.getNotification().extras.getString("android.title");
if (title == null) return;
if(sKeyboardTitleList.contains(title)){
//输入法关闭
}
}
方法二:使用辅助功能AccessibilityService检测编辑框的状态
- 优点:不需要安装多个输入法,通用性强
缺点:对关闭输入法的检测不稳定
public void onAccessibilityEvent(final AccessibilityEvent accessibilityEvent) { isClickEditable = false; isClickEditable = false; if(accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { if(accessibilityEvent.getSource() != null){ isClickEditable = accessibilityEvent.getSource().isEditable(); } }else if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED){ if(accessibilityEvent.getSource() != null){ isFocusedEditable = accessibilityEvent.getSource().isEditable(); } } if(isClickEditable || isFocusedEditable){ //输入法已打开 }else { //输入法已关闭 } }
方法三:使用Xposed框架获取系统打开关闭输入法消息
- 优点:稳定高效
- 缺点:需要安装Xposed框架
在InputMethodManagerService的handleMessage(Message msg)方法会处理软键盘的弹出可关闭。
private static XC_MethodHook sInputMethodManagerServiceInitHook = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Message message = (Message) param.args[0];
if (message.what == MSG_SHOW_SOFT_INPUT) {
//输入法打开
}else if (message.what == MSG_HIDE_SOFT_INPUT){
//输入法关闭
}
}
};
在Service中全局监听Android输入法的三种方法包括:通过通知栏事件、使用AccessibilityService检测编辑框状态和借助Xposed框架。方法一简单但需多输入法;方法二通用但可能不稳定;方法三稳定但依赖Xposed框架。
1282

被折叠的 条评论
为什么被折叠?



