一监听返回键或者菜单键的情况比较多,但也不排除有监听home键的需求啊。
监听返回键或者菜单键,可以通过重写activity的dispatchKeyEvent方法,判断event对象的KeyCode值来实现。
虽然android提供了一个常量KeyEvent.KEYCODE_HOME,让我们以为可以监听home键,但其实是不行的。
可以换个思路来做监听。我们知道,当点击了home键必然会调用activity生命周期的onStop()方法,但是调用了finish()方法或者被其他activity完全遮盖了,也会调用onStop()方法。那么只要我们能把后面两种情况区分出来,那么剩下的情况就是调用home键,对吧。
1.区分是否调用了finish()方法,这个好办,只要重写finish()方法,增加一个标记位即可
@Override public void finish() { // TODO Auto-generated method stub super.finish(); isActivityFinished=true; }
@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); if(!isActivityFinished){//没有销毁activity ActivityManager am=(ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> infoList=am.getRunningTasks(1); if(infoList.get(0).topActivity.getPackageName().startWith("com.android.launcher")){ Log.i("aaa", "点了home.................."); }else{ Log.i("aaa", "没点home.................."); } }else{ Log.i("aaa", "没点home.................."); } }主要是判断覆盖在该activity上的activity是否属于桌面应用,如果是,则点击了home键,否则,则没有点击。
不同的手机厂商对于桌面应用有不同的命名(这也跟api不一样有关),存在com.android.launcher,com.android.launcher2,com.android.launcher3这几种情况,但都是以com.android.launcher开头的,所以在判断的时候直接判断栈顶的activity包名是否以com.android.launcher开头即可。
但也有非常特殊的情况,例如一些厂商深度定制,把包名都完全改了。例如华为某平板的桌面包名就是com.huawei.android.launcher,那么这种特殊情况以上方法就不适应咯。
以上方法是在api 19环境下验证的。多谢。
原文:http://blog.csdn.net/ben0612/article/details/44594801