最近搬家了,从北京--->深圳,除了天气有点不同外,其他的都差不多,工作性质和以前也类似!纪念一下自己的迁移。

-----题外话

转载请表明出处: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 appreturn -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自定义锁屏总结【android锁屏研究一】相关推荐

  1. linux 锁屏 代码,Android锁屏与解屏相关代码分析

    我觉得对于普通人来说,最常见的是Android解屏的界面,然后应该是Home界面.今天就来分析一下解屏界面的相关代码(以索爱的解锁界面为例). 首先看解屏的界面,我把解屏的界面分为两个部分,最上部是s ...

  2. android4.0 去掉虚拟按键 教程,Android 4.0 隐藏虚拟按键(导航栏)的方法

    在Android4.0里,多了一些API,其中包括怎样隐藏虚拟按键(导航栏),这样编写游戏或一个视频播放器时,可以设置隐藏虚拟按键的参数,达到最佳效果,当然前提是使用的手机是有虚拟按键的,如下图所示下 ...

  3. android开发截屏代码,android截屏代码:C++实现

    android截屏代码:C++实现 示例代码在: frameworks\base\services\surfaceflinger\tests\screencap\screencap.cpp /* * ...

  4. android 手机录屏功能,Android录屏功能的实现

    最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的.直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个 ...

  5. android的横竖屏切换,Android横竖屏切换 初步探究

    当手机横竖屏切换的时候,activity,默认会重新走一遍生命周期,即销毁当前,然后重新创建 首先,很多软件在设计和开发中为了避免横竖屏切换时引发不必要的麻烦,通常需要让App禁止掉横竖屏的切换,这就 ...

  6. android骨架屏框架,Android 骨架屏效果,了解一下

    原标题:Android 骨架屏效果,了解一下 以前做应用开发时,在数据尚未加载前一般会先给用户一个提示,最简单粗暴的方式就是菊花图,大多数做法是放一张有个性的静态图,示意正在加载数据,这样体验会好些, ...

  7. android 锁屏音量,Android锁屏状态获取音量按键事件

    Android系统没有提供音量按键的广播,而Activity的onKeyDown方法只有在界面显示时才能捕获音量变化, 要在锁屏状态或后台获得音量按键事件,可以通过判断音量值的改变来判断是否按下了音量 ...

  8. android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)

    android 5.1 系统中 public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int polic ...

  9. android 自动亮屏解锁,android锁屏唤醒并解锁屏幕

    1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕:public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardMana ...

最新文章

  1. jquery将html转为pdf文件,通过Jquery将HTML Div转换为PDF
  2. 随机森林RF中的特征重要性的计算公式VIM
  3. Java网络编程笔记2
  4. Unity 高清渲染管线 ShaderGraph 实现简单的表面水流效果
  5. C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环
  6. opencv第三方库JAVA接口,SpringBoot使用OpenCV示例总结
  7. Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)
  8. linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由
  9. flask-前端-requests之response对应关系 text
  10. pythonwhile循环怎么修改数据类型_分级程序有while循环问题,使用不同的数据类型...
  11. oracle中查找某用户执行某张表的操作操作记录
  12. PHP User Agent
  13. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(三)——单级放大器
  14. 打印图片一直显示连接传真服务器,打印机打印时显示传真怎么办
  15. 上海大学计算机考证时间表
  16. 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.3 开始新游戏
  17. ElectronBot支线项目
  18. 《LeetCode刷题》—121. 买卖股票的最佳时机
  19. 100万量子比特,PsiQuantum要怎样实现?
  20. 蓝牙hid协议源码解析

热门文章

  1. ios apns netty java codec 防止粘包
  2. table height 100%问题
  3. 轻松scrum之旅 思维导图读书笔记
  4. 学习:配置hibernate
  5. 《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
  6. 实录:VCS双机使用DiskReservation资源导致多路径失效
  7. 一寸相思千万绪,人间没个安排处。
  8. [CF]Round 516
  9. 模拟利器Mockito
  10. Jenkins持续集成案例之-运维部署方式