当前位置: 代码迷 >> Android >> 【Android 通常进阶】换个思路来监听home键
  详细解决方案

【Android 通常进阶】换个思路来监听home键

热度:7   发布时间:2016-04-28 01:52:12.0
【Android 一般进阶】换个思路来监听home键

一监听返回键或者菜单键的情况比较多,但也不排除有监听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;	}

2.区分是否被其他activity完全遮盖。有被桌面应用、自己应用的activity以及别的应用activity覆盖三种情况,那么重写onStop()方法吧

	@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环境下验证的。多谢。

  相关解决方案