android 4.0 屏蔽home键实现

本文介绍了一种在Android应用中实现自定义锁屏功能的方法,包括如何在4.0及以上系统版本中通过`WindowManager`的`addView`方法将自定义视图添加到系统顶层,使用`LayoutParams.TYPE_SYSTEM_ERROR`来避免应用被强制关闭。文章进一步讨论了在多线程环境下确保锁屏功能正常运行的解决方案,包括将`LockLayer`类改为单例模式并添加状态判断逻辑。此外,文章还提到了实现过程中遇到的一个未明确的常量值,并寻求社区的帮助来理解其含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Java代码 收藏代码
  1. publicvoidonAttachedToWindow()
  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. publicstaticfinalintTYPE_SYSTEM_ERROR
  2. Since:APILevel1
  3. Windowtype:internalsystemerrorwindows,appearontopofeverythingtheycan.

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

Java代码 收藏代码
  1. publicclassLockLayer{
  2. privateActivitymActivty;
  3. privateWindowManagermWindowManager;
  4. privateViewmLockView;
  5. privateLayoutParamsmLockViewLayoutParams;
  6. publicLockLayer(Activityact){
  7. mActivty=act;
  8. init();
  9. }
  10. privatevoidinit(){
  11. mWindowManager=mActivty.getWindowManager();
  12. mLockViewLayoutParams=newLayoutParams();
  13. mLockViewLayoutParams.width=LayoutParams.MATCH_PARENT;
  14. mLockViewLayoutParams.height=LayoutParams.MATCH_PARENT;
  15. //实现关键
  16. mLockViewLayoutParams.type=LayoutParams.TYPE_SYSTEM_ERROR;
  17. //apktoolvalue,这个值具体是哪个变量还请网友帮忙
  18. mLockViewLayoutParams.flags=1280;
  19. }
  20. publicvoidlock(){
  21. if(mLockView!=null){
  22. mWindowManager.addView(mLockView,mLockViewLayoutParams);
  23. }
  24. }
  25. publicvoidunlock(){
  26. if(mWindowManager!=null){
  27. mWindowManager.removeView(mLockView);
  28. }
  29. }
  30. publicvoidsetLockView(Viewv){
  31. mLockView=v;
  32. }
  33. }

使用方法如下

Java代码 收藏代码
  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. Viewlock=View.inflate(this,R.layout.main,null);
  4. LockLayerlockLayer=newLockLayer(this);
  5. lockLayer.setLockView(lock);
  6. lockLayer.lock();
  7. }

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

Java代码 收藏代码
  1. publicclassLockLayer{
  2. privateActivitymActivty;
  3. privateWindowManagermWindowManager;
  4. privateViewmLockView;
  5. privateLayoutParamsmLockViewLayoutParams;
  6. privatestaticLockLayermLockLayer;
  7. privatebooleanisLocked;
  8. publicstaticsynchronizedLockLayergetInstance(Activityact){
  9. if(mLockLayer==null){
  10. mLockLayer=newLockLayer(act);
  11. }
  12. returnmLockLayer;
  13. }
  14. privateLockLayer(Activityact){
  15. mActivty=act;
  16. init();
  17. }
  18. privatevoidinit(){
  19. isLocked=false;
  20. mWindowManager=mActivty.getWindowManager();
  21. mLockViewLayoutParams=newLayoutParams();
  22. mLockViewLayoutParams.width=LayoutParams.MATCH_PARENT;
  23. mLockViewLayoutParams.height=LayoutParams.MATCH_PARENT;
  24. //实现关键
  25. mLockViewLayoutParams.type=LayoutParams.TYPE_SYSTEM_ERROR;
  26. //apktoolvalue,这个值具体是哪个变量还请网友帮忙
  27. mLockViewLayoutParams.flags=1280;
  28. }
  29. publicsynchronizedvoidlock(){
  30. if(mLockView!=null&&!isLocked){
  31. mWindowManager.addView(mLockView,mLockViewLayoutParams);
  32. }
  33. isLocked=true;
  34. }
  35. publicsynchronizedvoidunlock(){
  36. if(mWindowManager!=null&&isLocked){
  37. mWindowManager.removeView(mLockView);
  38. }
  39. isLocked=false;
  40. }
  41. publicsynchronizedvoidsetLockView(Viewv){
  42. mLockView=v;
  43. }
  44. }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值