Android 实现锁屏的较完美方案

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

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

咱们能够看到它彷佛是使用WindowManager添加View的方式实现了锁屏界面的添加,而不是使用传统的Activity的方式。git

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

咱们首先开启一个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里)。code

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

欢迎关注我Github 以及 @Geminici

相关文章
相关标签/搜索