【Android 一般进阶】换个思路来监听home键

一监听返回键或者菜单键的情况比较多,但也不排除有监听home键的需求啊。

监听返回键或者菜单键,可以通过重写activity的dispatchKeyEvent方法,判断event对象的KeyCode值来实现。

虽然android提供了一个常量KeyEvent.KEYCODE_HOME,让我们以为可以监听home键,但其实是不行的。

可以换个思路来做监听。我们知道,当点击了home键必然会调用activity生命周期的onStop()方法,,但是调用了finish()方法或者被其他activity完全遮盖了,也会调用onStop()方法。那么只要我们能把后面两种情况区分出来,那么剩下的情况就是调用home键,对吧。

1.区分是否调用了finish()方法,这个好办,只要重写finish()方法,增加一个标记位即可

@Overridepublic void finish() {// TODO Auto-generated method stubsuper.finish();isActivityFinished=true;}2.区分是否被其他activity完全遮盖。有被桌面应用、自己应用的activity以及别的应用activity覆盖三种情况,那么重写onStop()方法吧@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();if(!isActivityFinished){//没有销毁activityActivityManager 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环境下验证的。多谢。

那风再温柔。太深的流连便成了一种羁绊,

【Android 一般进阶】换个思路来监听home键

相关文章:

你感兴趣的文章:

标签云: