Android输入法主要的功能已经实现,使用体验也已经相对完善,当然部分细节需要不断的优化,这个就需要版本迭代来做了。使用的过程中能经常遇到一些细节的修改。输入法的产品负责人通过对比几款常用的输入法之后,终于又发现一个需要优化的细节,就是在输入法安装初次打开后,系统会要求用户开启输入法,只有将我们的输入法激活然后切换成默认输入法该输入法才能生效,对问题就出在这。通过对比发现,包括搜狗输入法,百度输入法,谷歌拼音输入法在内的输入法在用户点击跳转激活输入法界面,选择激活输入法之后,应用会自动跳出设置界面,返回输入法界面。具体操作看下图演示:
然后我们的输入法没有自动返回的功能,需要用户手动点击返回键才能返回到输入法界面,考虑到这确实是一个用户体验的问题,决定修复。当然首先考虑的就是使用广播监听的方式实现。为什么呢?因为在该界面除了激活操作外,还有一个切换操作,也就是输入法已经被激活,切换过去后输入法要能自动的获取到已经被设置成为了默认的输入法,就不在此界面停留,跳转到应用主界面。
输入法切换监听方式:
这个功能的实现就是使用广播监听系统输入法切换动作,然后判断当前默认的输入法是不是我们自己的输入法,切换输入法监听方式实现如下:
首先创建监听输入法切换的广播接收器:
然后在onStart()方法中注册监听输入法切换的广播:
最后在onStop()方法中取消广播:
在广播接收器中会判断当前默认输入法是不是自己:
这样监听输入法切换就实现了。
输入法激活监听方式:
但是通过研究Android广播接收action发现竟然没有输入法激活状态改变的广播,那么使用广播接收状态改变的方法就不行了。那还有什么好的办法呢?为什么其他输入法可以呢?他们走的是正规方式还是歪门邪道?国内应用使用歪门邪道还有情可原,谷歌拼音又是如何实现的呢?不应该是歪门邪道吧,那么就使用谷歌拼音的代码去看一看。
在网上找到谷歌拼音的安装包,分析启动部分代码。这时候发现谷歌拼音代码好多并且混淆严重,完全没有头绪。着启动部分代码,忽然一句话引起了我的注意,对,既然广播不行,那么会不是使用了ContentResolver观察系统设置的变化呢?那就测试一下:
首先实现自己的观察者对象:
然后在Activity的onCreate()方法中注册输入法激活观察者:
需要特别注意,这个最好在onCreate()方法中注册,不要在onStart()方法中注册,因为激活操作已经调转到系统设置界面,在onStart()和onStop()方法中注册会出现监听不到结果的情况。Activity的生命周期问题,在此不做解释。
最后在onDestroy()方法中取消注册:
判断输入法激活的方式如下:
实现后,发现确实可行。
总结一下:
应用有时候需要赋予一些特殊权限或者开启一些开关,这戏些操作需要跳转到设置界面进行。应用怎么监听用户是否已经完成了需要进行的操作并且做出一些对应的反馈呢?我现在已知的实现方式主要有两个:1,监听系统提供的广播,接收到广播的时候做主对应的一些提示或者动作。2,观察系统数据库的变化,当变化时判断是不是自己所需要的变动,可以以此做出对应的决策。这两点基本上能够满足该方面的需求了。这是技术方面的收获。
当然Android是一个开源的大集合,这就导致各种功能实现起来都有不同选择,其他方面也有实现监听激活的方式。比如说开启一个线程,每秒检测激活状态,当然种方式也能够达到这样的效果,但是,这不符合标准的开发人员基本思维方式,效率低下,为了整个Android平台地良性发展,共你我之力,一起寻找各方面更好的实现方式吧!