实现锁屏的方法,其实上网一搜一大把,无非是告诉你在Screen Off的时候启动某个Activity,同时把Keyguard禁用掉,但是通常情况下,似乎很难解决HOME键能解锁的这么一个问题,今天我们就来讲一个方案,就是如何近乎完美的实现我们的锁屏。

我们知道,锁屏的界面显示是使用KeyguardViewManager进行添加的,但是这个类属于Android的内部类,我们调用不到,它属于com.android.internal.policy.impl这个包,源码地址:https://github.com/android/platform_frameworks_policies_base/blob/mast...

我们可以看到它似乎是使用WindowManager添加View的方式实现了锁屏界面的添加,而不是使用传统的Activity的方式。

那么使用WindowManager是我们可行的方案,它的好处就是可以屏蔽Home键的触发,同时可以做一些特殊的动画效果。

我们首先开启一个Service,在Service中注册SREEN_OFF的广播,触发广播的时候,使用WindowManager加入锁屏页面,实现锁屏即可。
看下我们的Receiver代码:

javaif (action.equals(Intent.ACTION_SCREEN_OFF)) {    ViewParent viewParent = mContainer.getParent();    if (viewParent != null) {        return;    }    mKeyguardLock.disableKeyguard();    WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);    WindowManager.LayoutParams lp = generateLayoutParams();    windowManager.addView(mContainer, lp);} private WindowManager.LayoutParams generateLayoutParams() {    WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);    Display display = windowManager.getDefaultDisplay();    Point size = new Point();    display.getSize(size);    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();    lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;    lp.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;    lp.x = 0;    lp.y = 0;    lp.format = PixelFormat.TRANSLUCENT;    return lp;}

这里主要的是需要设置WindowManager的布局参数(LayoutParams),如果看WindowManager的源码的话,我们可以看见它的TYPE有一个TYPE_KEYGUARD,这就是系统锁屏用的类型了,但是它不提供给外部使用,因此我们只能使用级别比较高的TYPE_SYSTEM_ALERT,覆盖到锁屏的上面。format设置成TRANSLUCENT的原因是我们需要和锁屏交互的时候,锁屏后面的界面要显示出来,所以它是一个透明的层,这里没有办法,我们只能把一些交互的代码放到需要添加的View层中进行处理。

使用这种方式实现的锁屏,能较好的和Launcher或者其他界面交互(包括渐变、过渡等),而且能使得我们的锁屏界面不响应HOME键(使用Activity的方式的话,home会让我们进入到Launcher里)。

更多的内容我正在探索,敬请期待。

欢迎关注我Github 以及 @Gemini

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. Android(安卓)事件处理(—)(附源码)
  3. jadx:好用的反编译工具
  4. android 四大组件之Service两种调用方式使用详解
  5. Android创建桌面快捷方式两种方法
  6. 01 Android(安卓)布局使用的几种方式
  7. [CyanogenMOD移植教程]第二章:android 源码总体结构
  8. 一个Android工程师的学习实践之路
  9. Android(安卓)studio中配置androidannotations框架

随机推荐

  1. android的各种动作事件
  2. Android(安卓)自动化测试―robotium(七)Ant
  3. Android(安卓)6.0(M) BatteryService浅析
  4. 用busybox扩展android系统的控制台命令
  5. Android(安卓)app 优化
  6. Android(安卓)App项目开发步骤小结
  7. android 监听 APK 安装 与 删除等过程
  8. 运行Android程序时 resources.ap_ 文件不
  9. 自动完成AutoCompleteTextView(android)
  10. android activity 测试