android处于安全考虑,home键在应用层是捕获不到的,只有在底层才能获取其监听事件。



但是,我们有时是需要对home键进行处理的。那么怎样才能在我们的Activity层监听到home键呢。



步骤:



1,首先在AndroidManifest.xml添加一项权限:



    <uses-permission android:name=”android.permission.DISABLE_KEYGUARD” />



2,在你所需要的Activity中添加下面的方法:



@Override 
 
 
 

   public void onAttachedToWindow() { 
 
 
 

     this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
 
 
 

     super.onAttachedToWindow(); 
 
 
 

   }


    到此,对应Activity的home键已经被我们屏蔽掉。下面我们就可以对该键进行想要的处理了。



@Override 
 
 
 

   public boolean onKeyDown(int keyCode, KeyEvent event) { 
 
 
 

       if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_HOME) { 
 
 
 

           ... ... // 处理当点击home键想要的操作 
 
 
 

           return true; 
 
 
 

       } 
 
 
 

       return super.onKeyDown(keyCode, event); 
 
 
 

   }

  现在,我们可以试试效果了。结果发现,模拟器sdk2.2测试的效果没问题,公司的sdk2.3.5的对讲机也没问题,但是试了几部手机,一点效果都没有。后来才知道,从sdk3.0以后的版本,home键通过这种方法是屏蔽不了的。



---------------------------------------------------------------------------------------------------------------------



  后来,熟悉了工具Logcat,它是用来记录和查看系统调试信息的。我们可以想到,既然我们点击home键时,所有应用的界面都关闭了,那么这个动作肯定是会被记录到日志当中的。那么,我们是否可以通过获取点击home键时输出的log信息来监听它呢。现在我们得到了获取home键的方案,步骤如下:



1,首先在AndroidManifest.xml添加一项权限,用来读取系统的log信息:



<uses-permission android:name=”android.permission.READ_LOGS” />



2,在Activity中添加如下代码:


new Thread(new Runnable() {
 
 
    @Override
 
 
    public void run() {
 
 
        Process process= null;
 
 
        BufferedReader buffer = null;
 
 
        try {
 
 
// 获取系统logcat日志信息
 
 
            // ActivityManager 表示监听的tag, I 表示监听的Log类型, *:S 表示监听所有的信息
 
 
            // 即,tag为ActivityManager、Logcat类型为I的所有Log都会被获取到。
 
 
            process = Runtime.getRuntime().exec(new String[] {"logcat", "ActivityManager:I *:S"});
 
 
            buffer = new BufferedReader(new InputStreamReader(logcatProcess.getInputStream()));
 
 
            String line = null;
 
 
            while ((line = bufferedReader.readLine()) != null) {
 
 
                if (line.indexOf("cat=[android.intent.category.HOME]") > 0) {
 
 
 // "cat=[android.intent.category.HOME]"就是点击home键时logcat记录的信息
 
 
                        ... ...
 
 
                    //在这里就可以处理当你点击home键想要的操作了
 
 
                }
 
 
            }
 
 
        } catch (Exception e) {
 
 
            e.printStackTrace();
 
 
        }
 
 
    }
 
 
}).start();