获取home键

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();

posted on 2013-02-06 15:58  jasonyso  阅读(240)  评论(0编辑  收藏  举报

导航