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掉系统的就可以了;

[java] view plaincopyprint?

  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键的处理,我看网上有同学写博客了,有同学这么处理:

[java] view plaincopyprint?

  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()方法中也有根据,请看真相:

[java] view plaincopyprint?

  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数据的定义如下:

[java] view plaincopyprint?

  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;

[java] view plaincopyprint?

  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()方法中,

[html] view plaincopyprint?

  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中配置

[java] view plaincopyprint?

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

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

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

时间: 2024-10-12 23:23:16

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

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

[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. 而且在此界面中,我们可以用一些行为来退出,比如点击按钮等. 还有一个特征是在这个界面的时候,我们通常是不能使用底部的三个按钮的 关于如果屏蔽底部的三个按钮,我已经在另一篇博客Android4.0+锁屏程序开发——按键屏蔽篇进行了总结,有需要的朋友可以参看. 这篇博客我们主要讨论如何让一个Activ

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

开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu  看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只需要在我们的Activity中重写onKeyDown方法,并在其中对Back按键进行拦截即可,代码如下 //屏蔽back @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case

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

从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而且通过常规方法(Strings.xml中字符串)对该问题的定位会有很大的难度,拿这个界面来说,EMERGENCY CALL并不是Strings中值,而是  <string name="lockscreen_emergency_call">Emergency call</s

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

从图片中我们能够看到,这里在语义上有一定的反复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,只是因为Android4.3在锁屏功能上比起老版本号做了非常大的修改,并且通过常规方法(Strings.xml中字符串)对该问题的定位会有非常大的难度,拿这个界面来说,EMERGENCY CALL并非Strings中值,而是  <string name="lockscreen_emergency_call">Emergency call<

android4.0 A10开发板,如何实现分屏(多屏幕显示)不同的内容

============问题描述============ 设想是如上图所示 目前的情况是,我有A10的开发板,android4.0.4 如果有同行的话,希望能指点一下 目前能单独显示vga,hdmi,lvds三种屏幕 vga  和  hdmi如果同时插入的话总有一个是不能正常显示的,因为我配置的 sys_config1.fex文件里面有单独针对的参数, 只要能让我实现分屏显示不同的内容(不同的屏,显示的不同的内容连接的是同一块板子)就行,连接显示是vga和tv     vga和hdmi    h

android4.4系统永不锁屏

android4.4\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java /** * External apps (like the phone app) can tell us to disable the keygaurd. */ private boolean mExternallyEnabled = false;//系统此属性默认是true,本类把所有的mExternal

android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效的解决方法

Android横竖屏幕切换时注意4.0以上配置configChanges要加上screenSize,要不还会调用onCreate(). <activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize"/> android4.0 禁止横竖屏切换使用 android:configChanges="orientati

IOS8.0(Objective-C) 手势锁屏App

IOS8.0(Objective-C) 手势锁屏App IOS 手势锁屏实现逻辑分析: 1.通过循环在页面中添加透明背景白色边框的按钮(默认为九个)并设置 tag 值,以便与原始密码核对 2.扑捉手势,主要用到touchesBegan.touchesMoved 和 touchesEnded 3.将手势经过的按钮划线链接起来,主要用到  CGContextRef 2D绘画对象 如下代码所示为 IOS 手势锁屏全部 App源码,仅供学习: ViewController.h #import <UIKi

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

在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个方法不能用于已经绑定了 data 加密的设备.例如 Motorola,设置了输入锁屏密码才能启动设备,这种方法就不再适用了.原因是这种类型的设备,使用了锁屏密码加密了 data 分区,导致无法修改 data 分区. 适用 Android Android 7.0+ 已测试机型 Moto Z Andro