[Android]完美屏蔽Home键

先声明一下,此方法仅仅适用于源码环境,apk开发的请绕道哦。

一、修改

修改文件:PhoneWindowManager.java

修改路径:frameworks/base/policy/src/com/android/internal/policy/impl

修改方法:

在interceptKeyBeforeDispatching中添加在注释中间加的那2个行

          
if (attrs != null) {
    final int type = attrs.type;
    // add by y.haiyang@outlook.com(start)
    final int homeKeyFlag = flag & WindowManager.LayoutParams.FLAG_DISMISS_HOME_KEY;
    // add by y.haiyang@outlook.com(end)
    if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
        || type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) 
        // add by y.haiyang@outlook.com(start)
        || homeKeyFlag == WindowManager.LayoutParams.FLAG_DISMISS_HOME_KEY) {  
        // add by y.haiyang@outlook.com(end)                                 
        // the "app" is keyguard, so give it the key
      return 0;
   }
.......
.....

二、应用

应用的时候也很简单,在Activity onCreate 的时候进行add一下 咱刚刚添加的flag就行

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_HOME_KEY);
        setContentView(R.layout.mainkey);

三、说明

1. WindowManager.LayoutParams.FLAG_DISMISS_HOME_KEY; 这个值 自己去加一下就行

2. 网上还有一种方法说重新添加一下onAttachedToWindow 这个方法就行(还要注意加权限)但是我用起来一直报错,不知道怎么个情况。

         @Override  
             public void onAttachedToWindow()  
             {  
                 this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);  
                 super.onAttachedToWindow();  
             }  
			 

3. 担心某些人还是不懂修改那些,现在贴上修改文件的前后比较。



====================关注小鱼===================

新浪微博http://weibo.com/AwareMissing

腾讯微博http://t.qq.com/y_haiyang


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,我们可以通过重写Activity的onBackPressed()方法屏蔽返回的功能,代码如下: ``` @Override public void onBackPressed() { // 屏蔽返回 // super.onBackPressed(); // 如果需要默认的返回功能,需要注释掉这行代码 } ``` 对于HOME屏蔽,由于Android系统限制,我们无法屏蔽HOME的功能。但是我们可以监听HOME的按下事件,并在按下事件发生时做一些特定的操作,例如弹出对话框或者跳转到其他页面。代码如下: ``` private static final String SYSTEM_DIALOG_REASON_KEY = "reason"; private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onAttachedToWindow() { super.onAttachedToWindow(); // 监听HOME getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { // HOME按下事件 return true; } return super.onKeyDown(keyCode, event); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { // 如果Activity失去了焦点,则判断是否是HOME按下事件 Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 判断是否是HOME按下事件 String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) { // HOME按下事件 } } ``` 需要注意的是,由于Android系统限制,无法屏蔽HOME的功能,因此以上代码只能监听HOME的按下事件,并在按下事件发生时做一些特定的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值