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 /** ...
随机推荐
- C++之基础知识20170830
/*************************************************************************************************** ...
- Android之框架20160721
Android的四层架构分别为:Linux2.6内核层,核心库层,应用框架层,应用层. 其中Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我 ...
- 将项目通过maven install到本地仓库后,Intellij中其他调用的项目无法引用该jar
通常,我们会新建一个项目,其为其他项目添加公共的能力.其他项目可以引用其maven坐标来使用其提供的功能. 但最近做项目发现,修改了公共项目中的代码,并且使用mavan install将其jar安装到 ...
- Qt实现截屏并保存(转载)
原博地址:http://blog.csdn.net/qinchunwuhui/article/details/52869451?_t_t_t=0.28889142944202306 目前对应用实现截屏 ...
- HDU 5489 二分 LIS
Removed Interval Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Educational Codeforces Round 24 A 水 B stl C 暴力 D stl模拟 E 二分
A. Diplomas and Certificates time limit per test 1 second memory limit per test 256 megabytes input ...
- 洛谷P1434 滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- php开启压缩gzip
php服务的开启压缩,节省带宽 看是否开启压缩的网站 http://www.cnblogs.com/GaZeon/p/5421906.html 找到php.ini,修改下面的 ,重启php-fpm z ...
- web系统中上下移动功能的实现
其实上移下移的思想分几步: 核心思想:交换两个记录的位置字段的值. 问题:如何根据当前记录,找到前一个或者后一个的记录的位置. 第一:在java类属性定义一个position位置字段,不同的位置pos ...
- C++并发编程 等待与唤醒
C++并发编程 等待与唤醒 条件变量 条件变量, 包括(std::condition_variable 和 std::condition_variable_any) 定义在 condition_var ...