zoukankan      html  css  js  c++  java
  • android4.0自定义锁屏总结【android锁屏研究一】

           最近搬家了,从北京搬到深圳了,来到了一个新公司,不过还是做类似的事情,除了天气有点不同外,其他的基本还都适应。

                                                                                                                -----题外话

            好了,言归正传,说说锁屏了,其实把锁屏做成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,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 中,只需要添加该标志就可以了
    
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
    
    如果要使home 键有效,再 clearFlags 即可。
    
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
    
    

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

    这个代码来源于PhoneWindowManager.java这个类,

     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掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路可以留言讨论?

  • 相关阅读:
    DrawSVG
    Cool!15个创意的 CSS3 文本效果【下篇】
    分享最新15个加速 Web 开发的框架和工具
    Unsplash.it
    Cool!15个超炫的 CSS3 文本特效【上篇】
    Codrops 实验:使用 Vibrant.js 提取图像颜色
    Javscript调用iframe框架页面中函数的方法
    竞争的残酷性暂时只体现在产业竞争上(老美有发达的制药、农业、军工、金融、航空、航天、石油、化工等产业,还有以芯片为代表的高端服务业)
    Qt元对象(Meta-Object)系统与反射
    安晓辉:程序员在公司没事干时候,做什么好?(产品上想多一点,设计上想多一点,技术上做深一点、做宽一点,思维框架上学多一点)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3037508.html
Copyright © 2011-2022 走看看