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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。