android4.0 锁屏实现(转)
转载请表明出处:http://blog.csdn.net/wdaming1986/article/details/8837023
好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题的,导致不必要的麻烦,就像市场上的流行的Go锁屏和91锁屏也是会有一些问题的,只是影响不大,最好的做法是修改源码,在源码中定制自己的锁屏,这样一劳永逸;
首先做锁屏考虑的事有以下四点;
(1)替换掉系统的锁屏,不能让系统的锁屏显示出来;
(2)屏蔽掉Home键盘,back键,menu键;
(3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;
(4)每次开机显示自己的锁屏
针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;
针对(1),这个比较容易,就调用disableKeyguard掉系统的就可以了;
- mKeyguardManager = (KeyguardManager)Class.this.getSystemService(Context.KEYGUARD_SERVICE);
- mKeyguardLock = mKeyguardManager.newKeyguardLock("my_lockscreen");
- mKeyguardLock.disableKeyguard();
注意:在Manifext.xml中加入权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
针对(2),这个Home键的处理,我看网上有同学写博客了,有同学这么处理:
- public class LockLayer {
- private Activity mActivty;
- private WindowManager mWindowManager;
- private View mLockView;
- private LayoutParams mLockViewLayoutParams;
- private static LockLayer mLockLayer;
- private boolean isLocked;
- public static synchronized LockLayer getInstance(Activity act){
- if(mLockLayer == null){
- mLockLayer = new LockLayer(act);
- }
- return mLockLayer;
- }
- private LockLayer(Activity act) {
- mActivty = act;
- init();
- }
- private void init(){
- isLocked = false;
- mWindowManager = mActivty.getWindowManager();
- mLockViewLayoutParams = new LayoutParams();
- mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;
- mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;
- //实现关键
- mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
- //apktool value,这个值具体是哪个变量还请网友帮忙
- mLockViewLayoutParams.flags = 1280;
- }
- public synchronized void lock() {
- if(mLockView!=null&&!isLocked){
- mWindowManager.addView(mLockView, mLockViewLayoutParams);
- }
- isLocked = true;
- }
- public synchronized void unlock() {
- if(mWindowManager!=null&&isLocked){
- mWindowManager.removeView(mLockView);
- }
- isLocked = false;
- }
- public synchronized void setLockView(View v){
- mLockView = v;
- }
- }
原理:是把这个view当成系统的错误的view,
这个在PhoneWindowManager.java中的interceptKeyBeforeDispatching()方法中也有根据,请看真相:
- final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
- for (int i=0; i<typeCount; i++) {
- if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
- // don't do anything, but also don't pass it to the app
- return -1;
- }
- }
看注释:如果设置了这两个属性的其中一个,就不做任何处理,home键不对这个app生效;
而WINDOW_TYPES_WHERE_HOME_DOESNT_WORK数据的定义如下:
- private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {
- WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
- WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
- };
这下你就明白为什么上述代码设置为TYPE_SYSTEM_ERROR,其实设置为TYPE_SYSTEM_ALERT也可以的。
再来看看sdk文档有解释说明,
Window type: internal system error windows, appear on top of everything they can. In multiuser systems shows only on the owning user's window.
这个error的view在所有的view的最上面,所以就可以达到屏蔽home键的效果了;
问题来了:在这个界面长按power键,关机界面也弹不出来了,这个我试验过,所以这个方法不可取;
还有同学说这么做:
private static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
- 在app 的你要屏蔽home 键的activity 中,只需要添加该标志就可以了
- this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);
- 如果要使home 键有效,再 clearFlags 即可。
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
注意:以上代码要加在setContentView()之前才行;
这个代码来源于PhoneWindowManager.java这个类的interceptKeyBeforeDispatching()方法中,
- if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {
- // the window wants to handle the home key, so dispatch it to it.
- return 0;
- }
这样设置,有的同学感觉好用,有的同学感觉不好用;
原因:android4.0的源码的PhoneWindowManager.java没有添加上述代码,所以不起作用,
而4.1的源码PhoneWindowManager.java中有这个代码,所以好用,这个请大家看看对应的源码是否有上述代码;
针对(3),这个就模仿Go锁屏和91锁屏,在启动锁屏的activity中配置
- <category android:name="android.intent.category.HOME" />
这个属性,然后先清除系统启动的默认设置,就是选择系统点击Home键启动哪个home,设置为启动自己的锁屏,然后再设置解锁后启动那个桌面,这个自己处理下逻辑就可以了,大致思路就是这个样子的;
针对(4),这个Go锁屏还有91锁屏处理的都不太理想,回头我想到好的思路再更新,大致思路是:监听开机广播, <action android:name="android.intent.action.BOOT_COMPLETED"/>,这个写一个MYBootCompletedReceiver类,作用是disable掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路或见解可以留言讨论?
android4.0 锁屏实现(转)的更多相关文章
- Android4.0+锁屏程序开发——设置锁屏页面篇
[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...
- Android4.0+锁屏程序开发——按键屏蔽篇
开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu 看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只 ...
- 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复
从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而 ...
- 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义反复
从图片中我们能够看到,这里在语义上有一定的反复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,只是因为Android4.3在锁屏功能上比起老版本号做了非常大的修改 ...
- android6.0锁屏界面接收新通知处理流程
灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...
- 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复
[源码下载] 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复 作者:webabcd 介绍与众不同 win ...
- android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效
android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效 在之前的版本中都是在Man ...
- Android 7.0 以上保留数据去除锁屏密码的方法
在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个 ...
- android4.4系统永不锁屏
android4.4\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java /** ...
随机推荐
- 【数学】【P5076】 Tweetuzki 爱整除
Description 对于一个数 \(k\),找到任意一个 \(x\),满足 \(0~\leq~k~\leq~x~\leq~10^{18}\) 且对于任意一个 \(x\) 进制数,把该数字各数位上的 ...
- Spring MVC同时接收一个对象与List集合对象
原:https://blog.csdn.net/u011781521/article/details/77586688/ Spring MVC同时接收一个对象与List集合对象 2017年08月25日 ...
- BNU-2017.7.4排位赛2总结
链接:https://www.bnuoj.com/v3/contest_show.php?cid=9147#info A题 sort之后交换首尾两个数. B题 for一遍,如果每个数都在对应位置了,输 ...
- centos7下安装配置jenkins+git+maven+jdk
环境 centos7 jdk1.8 maven3 git 在安装jenkins之前,先安装jdk1.8.maven.git 一. 安装jdk1.8 第一步:下载 jdk-8u131-linux-x64 ...
- Gogent相关问题的解决(不断更新)
1:今天早上打开推特,发现进不去了,google浏览器一直提示404……找不到网址,真心郁闷.后来,查了查,才知道,最近google在北京的主干服务器被xx了,某些省就上不了了…… ……乱七八糟的不说 ...
- NOIP 2014 提高组 Day2
期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...
- Python学习笔记(五十)爬虫的自我修养(三)爬取漂亮妹纸图
import random import urllib from urllib import request import os ################################### ...
- bash高级
重定向 管道: ps -ef | grep bash 管道作为命令衔接的 两个都写 ,一个到文件,一个到屏幕 tee null
- CSS属性的私有前缀
在CSS属性能中,我们常常能看到-webkit-,-moz-之类的前缀,这种就叫做浏览器私有前缀,是浏览器对于新CSS属性的一个提前支持.-webkit-是webkit内核的,-moz-是Firefo ...
- JS操作CSS随机改变网页背景
今天有个朋友在weibo上问我可不可以用JS和CSS让页面每次刷新随机产生一张背景图,当然我的回答是可以的.具体可以这样做: 1.用JS定义一个图片数组,里面存放你想要随机展示的图片 1 2 3 4 ...