android4.0自定义锁屏apk形式总结

好了,言归正传,说说锁屏了,其实把锁屏做成apk的形式,会引起很多问题的,导致不必要的麻烦,就像市场上的流行的Go锁屏和91锁屏也是会有一些问题的,只是影响不大,最好的做法是修改源码,在源码中定制自己的锁屏,这样一劳永逸;

首先做锁屏考虑的事有以下四点;

         (1)替换掉系统的锁屏,不能让系统的锁屏显示出来;

        (2)屏蔽掉Home键盘,back键,menu键;

        (3)在其他界面或Launcher界面,长按home键,不能让自己的锁屏apk显示在最近任务中;

        (4)每次开机显示自己的锁屏


 

        针对这四点一一做解答,不一定是完整的代码,只是提供以下思路,有兴趣的同学可以提出疑问;

          针对(1) ,这个比较容易,就调用disableKeyguard掉系统的就可以了;


Java code ?
1
2
3
4
5
6
[java] view plaincopyprint?
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键的处理,我看网上有同学写博客了,有同学这么处理:

[java] view plaincopyprint?

   原理:是把这个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;

Java code ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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;     
     }     
}    

在app 的你要屏蔽home 键的activity 中,只需要添加该标志就可以了  
  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);  
  
如果要使home 键有效,再 clearFlags 即可。  
  
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);  
注意:以上代码要加在setContentView()之前才行;

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

[html] view plaincopyprint?
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掉系统的锁屏,然后启动自己的锁屏的服务,监听屏幕亮和灭的广播,这个屏幕亮和灭的广播要动态监听;大家有好的思路可以留言讨论?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值