zoukankan      html  css  js  c++  java
  • 屏蔽home

    引用:http://zuoshu.iteye.com/blog/1505796

    最近研究锁屏,按照常规的方法,常规方法如下

    Java代码  收藏代码
    1. public void onAttachedToWindow()  
    2. {    
    3.        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);       
    4.        super.onAttachedToWindow();    
    5. }   

     但是这个方法到了4.0的系统上就失效了,按home照样会返回桌面。apktool了几个锁屏的软件之后发现其实现方法,即用WindowManager的addview方法将view加到窗口上,加上的时候将view的layoutparamas的type设为LayoutParams.TYPE_SYSTEM_ERROR,这个值sdk的解释为

    Java代码  收藏代码
    1. public static final int TYPE_SYSTEM_ERROR   
    2. Since: API Level 1   
    3. Window type: internal system error windows, appear on top of everything they can.   

     如果直接这样用会报错,还要在AndroidManifest.xml里面加上权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>,ok上完整代码,封装了一个类,其中Lock和hide方法实现锁屏和解锁。

    Java代码  收藏代码
    1. public class LockLayer {  
    2.     private Activity mActivty;  
    3.     private WindowManager mWindowManager;  
    4.     private View mLockView;  
    5.     private LayoutParams mLockViewLayoutParams;  
    6.       
    7.     public LockLayer(Activity act) {  
    8.         mActivty = act;  
    9.         init();  
    10.     }  
    11.   
    12.     private void init(){  
    13.         mWindowManager = mActivty.getWindowManager();  
    14.         mLockViewLayoutParams = new LayoutParams();  
    15.         mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;  
    16.         mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;  
    17.         //实现关键  
    18.         mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;  
    19.         //apktool value,这个值具体是哪个变量还请网友帮忙  
    20.         mLockViewLayoutParams.flags = 1280;  
    21.     }  
    22.     public void lock() {  
    23.         if(mLockView!=null){  
    24.             mWindowManager.addView(mLockView, mLockViewLayoutParams);  
    25.         }  
    26.     }  
    27.     public void unlock() {  
    28.         if(mWindowManager!=null){  
    29.             mWindowManager.removeView(mLockView);  
    30.         }  
    31.     }  
    32.     public void setLockView(View v){  
    33.         mLockView = v;  
    34.     }  
    35. }  

     使用方法如下

    Java代码  收藏代码
    1. public void onCreate(Bundle savedInstanceState) {  
    2.         super.onCreate(savedInstanceState);  
    3.         View lock = View.inflate(this, R.layout.main, null);  
    4.         LockLayer lockLayer = new LockLayer(this);  
    5.         lockLayer.setLockView(lock);  
    6.         lockLayer.lock();  
    7.     }  

    ok,这时可以实现按home键不返回桌面的效果,其他的键需要用另外的代码实现,网上都有。这段代码只调用一次的时候没有问题,但是如果遇到多线程或者多次lock和hide就会有问题,修改如下,一是将LockLayer改为单例模式,二是在hide和lock的时候先判断状态。修改后代码如下

    Java代码  收藏代码
    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.       
    9.     public static synchronized LockLayer getInstance(Activity act){  
    10.         if(mLockLayer == null){  
    11.             mLockLayer = new LockLayer(act);  
    12.         }  
    13.         return mLockLayer;  
    14.     }  
    15.       
    16.     private LockLayer(Activity act) {  
    17.         mActivty = act;  
    18.         init();  
    19.     }  
    20.   
    21.     private void init(){  
    22.         isLocked = false;  
    23.         mWindowManager = mActivty.getWindowManager();  
    24.         mLockViewLayoutParams = new LayoutParams();  
    25.         mLockViewLayoutParams.width = LayoutParams.MATCH_PARENT;  
    26.         mLockViewLayoutParams.height = LayoutParams.MATCH_PARENT;  
    27.         //实现关键  
    28.         mLockViewLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;  
    29.         //apktool value,这个值具体是哪个变量还请网友帮忙  
    30.         mLockViewLayoutParams.flags = 1280;  
    31.     }  
    32.     public synchronized void lock() {  
    33.         if(mLockView!=null&&!isLocked){  
    34.             mWindowManager.addView(mLockView, mLockViewLayoutParams);  
    35.         }  
    36.         isLocked = true;  
    37.     }  
    38.     public synchronized void unlock() {  
    39.         if(mWindowManager!=null&&isLocked){  
    40.             mWindowManager.removeView(mLockView);  
    41.         }  
    42.         isLocked = false;  
    43.     }  
    44.     public synchronized void setLockView(View v){  
    45.         mLockView = v;  
    46.     }  
    47. }  

     还有个问题是mLockViewLayoutParams.flags = 1280;1280这个值具体是哪个变量还不知道,有知道的留个言。

  • 相关阅读:
    usaco dec 2012 first!
    uva 1449
    unity3D学习笔记之DOTween插件的学习(持续更新)
    中南林业科技大学第十一届程序设计大赛 G 0和5
    中南林业科技大学第十一届程序设计大赛 D 最大的湖
    最小生成树之克鲁斯卡尔(Kruskal)算法
    最小生成树Prim算法理解
    判断无向图是否联通模板(并查集版)(DFS),BFS等其他方法将陆续更新
    矩阵压缩学习笔记
    C/C++ assert()函数用法总结
  • 原文地址:https://www.cnblogs.com/sode/p/2733133.html
Copyright © 2011-2022 走看看