废话不多说,最近两天,学习研究了一下锁屏相关,以及浮窗相关,这里整理一下。
下面是一个自己写的单词锁屏的软件。
先贴一下图,有兴趣的可以继续往下看:
now 主要说说遇到的坑和学到的技术
- 1、6.0以上的手机使用system_alert_window权限,很特殊,需要跳转到设置里面去设置。并且,对于其他Android厂商的不同rom,如miui等更需要特殊对待。6.0以下使用的话原生的系统直接配置使用即可,但是还是其他厂商的rom需要适配。
- 2、对于浮窗的话,目前来说,个人搜罗了网上的一些方法只有,发现廖祜秋他们的window type 是toast的方法为最佳http://www.jianshu.com/p/167fd5f47d5c , 不需要权限即可使用。但是,如果对于锁屏来说,它有一个小问题,就是它没有办法禁止状态栏下拉、返回、home等键的使用。它只是在window上面蒙了一层而已,不太适合做锁屏。但是,如果做类似小球浮窗,来电浮窗的话,是个很好的选择
- 3、真正比较好的方式,是用window type为 TYPE_SYSTEM_ERROR的方式http://www.ay27.com/2015/01/24/2015-01-24-android-keyguard/ ,这种方式能够很好的禁止状态栏下拉(沉浸式),home,返回键等操作,完美。
- 4、这两种方式都可以交互
- 5、锁屏是记单词的锁屏,用到了数据库,目前没有找到好的开源API,所以只有去网上找db或者sql自己生成。加载的时候需要新开线程操作,加载好了之后才使用。
- 6、我的加载单词的策略:一天加载20个,在词库中随机选20个,然后一天之内所有出现的单词都在这20个当中。加载数据库的时候,只有每天的第一次加载才会加载,不必每次都加载。
- 7、数据库:realm ,比较坑,它很强大,但是有个小地方,不支持list<String > String[]。
- 8、软键盘里面的完成按钮,
setImeOptions(EditorInfo.IME_ACTION_DONE);
需要在代码里设置,有时候xml里设置不管用 - 9、用到了正则过滤中文、英文、符号等方法
- 10、这里用到了监听开屏的广播,不是用的"android.intent.action.SCREEN_ON",因为它需要动态注册在xml中注册无效。而是用的是"android.intent.action.USER_PRESENT",这个是相当于,用户界面展示的监听,也就是你从锁屏进入home界面的监听,那时候,我们就可以跳转我们的锁屏界面了。
- 11、还有关于一天只执行一次的算法策略问题。
- 12、有一点小问题就是,有时候熄屏只有过不了多久,进程会死,死了之后就监听不到系统广播了,这点我还在研究改进,希望大家快来交流