因为应用中需要监听home键。按照以往的方式发现home键监听不到了。
4.0以前我们都用以下方法来监听:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(KeyEvent.KEYCODE_HOME==keyCode)
android.os.Process.killProcess(android.os.Process.myPid());
return super.onKeyDown(keyCode, event);
}
@Override
public void onAttachedToWindow(){
// TODO Auto-generated method stub
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
但是4.0以后,在framework层就把home按键监听给拦截了,应用层无法捕获。于是我百度了下方法。发现可以通过监听“logcat”打印的log来捕捉home监听。方法如下:
private checkHomeThread checkThread;
checkThread = new checkHomeThread();
checkThread.start();
class checkHomeThread extends Thread{
@Override
public void run() {
super.run();
Process mLogcatProc = null;
BufferedReader reader = null;
try {//获取logcat日志信息
mLogcatProc = Runtime.getRuntime().exec(new String[] { "logcat","ActivityManager *:S" });
reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("line ===== " + line);
if (line.indexOf("--------- beginning of /dev/log/system") > 0) {
//logcat打印信息在这里可以监听到
// 使用looper 把给界面一个显示
Looper.prepare();
System.out.println("checkHome is SUCCESS !");
Looper.loop();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是由于我用的源码是Mstar修改过的源码,他们的工程师把,ActivityManager的log给关闭了。无法捕获,失败告终。
最后请教了一个资深android开发工程师,得到了以下方法,其实按home键的时候还是有广播发出的,需要接受后解析下才能收到,方法如下,屡试不爽:
先在onCreate注册广播:
IntentFilter mfFilter = new IntentFilter();
mfFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(filterReceiver, mfFilter);
然后:
private final BroadcastReceiver filterReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if((Intent.ACTION_CLOSE_SYSTEM_DIALOGS).equals(action)){
String reason = intent.getStringExtra("reason");
if(reason!=null && reason.equals("homekey")){
System.out.println("这里做你想做的!");
}
}
}
};
大功告成!谢谢大家~