转载请表明出处http://blog.csdn.net/wdaming1986/article/details/8837023

好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题的,导致不必要的麻烦,就像市场上的流行的Go锁屏和91锁屏也是会有一些问题的,只是影响不大,最好的做法是修改源码,在源码中定制自己的锁屏,这样一劳永逸;

首先做锁屏考虑的事有以下四点;

(1)替换掉系统的锁屏,不能让系统的锁屏显示出来;

        (2)屏蔽掉Home键盘,back键,menu键;

        (3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;

        (4)每次开机显示自己的锁屏

针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;

针对(1),这个比较容易,就调用disableKeyguard掉系统的就可以了;

  1. mKeyguardManager = (KeyguardManager)Class.this.getSystemService(Context.KEYGUARD_SERVICE);
  2. mKeyguardLock = mKeyguardManager.newKeyguardLock("my_lockscreen");
  3. mKeyguardLock.disableKeyguard();

注意:在Manifext.xml中加入权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

针对(2),这个Home键的处理,我看网上有同学写博客了,有同学这么处理:

  1. public class LockLayer {
  2. private Activity mActivty;
  3. private WindowManager mWindowManager;
  4. private View mLockView;
  5. private LayoutParams mLockViewLayoutParams;
  6. private static LockLayer mLockLayer;
  7. private boolean isLocked;
  8. public static synchronized LockLayer getInstance(Activity act){
  9. if(mLockLayer == null){
  10. mLockLayer = new LockLayer(act);
  11. }
  12. return mLockLayer;
  13. }
  14. private LockLayer(Activity act) {
  15. mActivty = act;
  16. init();
  17. }
  18. private void init(){
  19. isLocked = false;
  20. mWindowManager = mActivty.getWindowManager();
  21. mLockViewLayoutParams = new LayoutParams();
  22. mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;
  23. mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;
  24. //实现关键
  25. mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
  26. //apktool value,这个值具体是哪个变量还请网友帮忙
  27. mLockViewLayoutParams.flags = 1280;
  28. }
  29. public synchronized void lock() {
  30. if(mLockView!=null&&!isLocked){
  31. mWindowManager.addView(mLockView, mLockViewLayoutParams);
  32. }
  33. isLocked = true;
  34. }
  35. public synchronized void unlock() {
  36. if(mWindowManager!=null&&isLocked){
  37. mWindowManager.removeView(mLockView);
  38. }
  39. isLocked = false;
  40. }
  41. public synchronized void setLockView(View v){
  42. mLockView = v;
  43. }
  44. }

原理:是把这个view当成系统的错误的view,

这个在PhoneWindowManager.java中的interceptKeyBeforeDispatching()方法中也有根据,请看真相:

  1. final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
  2. for (int i=0; i<typeCount; i++) {
  3. if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
  4. // don't do anything, but also don't pass it to the app
  5. return -1;
  6. }
  7. }

看注释:如果设置了这两个属性的其中一个,就不做任何处理,home键不对这个app生效;

而WINDOW_TYPES_WHERE_HOME_DOESNT_WORK数据的定义如下:

  1. private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {
  2. WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
  3. WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
  4. };

这下你就明白为什么上述代码设置为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;

  1. 在app 的你要屏蔽home 键的activity 中,只需要添加该标志就可以了
  2. this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);
  3. 如果要使home 键有效,再 clearFlags 即可。
  4. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);

注意:以上代码要加在setContentView()之前才行;

这个代码来源于PhoneWindowManager.java这个类的interceptKeyBeforeDispatching()方法中,

  1. if ((flag & WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED) != 0) {
  2. // the window wants to handle the home key, so dispatch it to it.
  3. return 0;
  4. }

这样设置,有的同学感觉好用,有的同学感觉不好用;

原因:android4.0的源码的PhoneWindowManager.java没有添加上述代码,所以不起作用,

而4.1的源码PhoneWindowManager.java中有这个代码,所以好用,这个请大家看看对应的源码是否有上述代码;

针对(3),这个就模仿Go锁屏和91锁屏,在启动锁屏的activity中配置

  1. <category android:name="android.intent.category.HOME" />

这个属性,然后先清除系统启动的默认设置,就是选择系统点击Home键启动哪个home,设置为启动自己的锁屏,然后再设置解锁后启动那个桌面,这个自己处理下逻辑就可以了,大致思路就是这个样子的;

针对(4),这个Go锁屏还有91锁屏处理的都不太理想,回头我想到好的思路再更新,大致思路是:监听开机广播, <action android:name="android.intent.action.BOOT_COMPLETED"/>,这个写一个MYBootCompletedReceiver类,作用是disable掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路或见解可以留言讨论?

android4.0 锁屏实现(转)的更多相关文章

  1. Android4.0+锁屏程序开发——设置锁屏页面篇

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  2. Android4.0+锁屏程序开发——按键屏蔽篇

    开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu  看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只 ...

  3. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复

    从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而 ...

  4. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义反复

    从图片中我们能够看到,这里在语义上有一定的反复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,只是因为Android4.3在锁屏功能上比起老版本号做了非常大的修改 ...

  5. android6.0锁屏界面接收新通知处理流程

    灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...

  6. 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复

    [源码下载] 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复 作者:webabcd 介绍与众不同 win ...

  7. android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效

    android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效    在之前的版本中都是在Man ...

  8. Android 7.0 以上保留数据去除锁屏密码的方法

    在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个 ...

  9. android4.4系统永不锁屏

    android4.4\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java /** ...

随机推荐

  1. BZOJ 3709&&AGC 018 C——多段排序的微扰法

    BZOJ 3709• 有n只怪物,你的初始生命值为z.• 为了打败第i只怪物,你需要消耗cost[i]点生命值,但怪物死后会使你恢复val[i]点生命值.• 任何时候你的生命值都不能小于等于0.• 问 ...

  2. 【hdu6051】If the starlight never fade

    Portal --> hdu6051 Solution ​ 神仙题qwq好吧我个人感觉是神仙题 ​​ 这题其实有一个比较野路子的做法..就是..打表观察..反正场上ckw大佬就是这样把这题A穿的 ...

  3. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) D 构造烟花

    D. High Load time limit per test 2 seconds memory limit per test 512 megabytes input standard input ...

  4. Idea安装findbugs插件,以及findbugs安装find security bugs插件

    第一:先讲述Idea怎么安装findbugs插件 具体操作如下面的图所示: 然后就可以安装findbugs 第二:findbugs怎么安装find security bugs这个find bugs的插 ...

  5. Ngingx--location匹配顺序

      location = /  精确匹配 /,后面不能带任何字符 location /     所有地址都是以 / 开头,所以这条规则将会匹配到所有请求.但优先级最低. location /docum ...

  6. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  7. [DeeplearningAI笔记]序列模型2.7负采样Negative sampling

    5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.7 负采样 Negative sampling Mikolov T, Sutskever I, Chen K, et a ...

  8. 使用infinite-scroll实现Ghost博文列表的滚动加载

    Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...

  9. 【总结】前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  10. MySQL join 用法

    select column1, column2 from TABLE1 join TABLE2 on 条件 # select * from table1 join table2; #两个表合成一个se ...