【Android不太基础】换个思路来监听home键

标签: android 基础 监听 | 发表时间:2015-03-24 22:39 | 作者:ben0612
出处:http://blog.csdn.net

一监听返回键或者菜单键的情况比较多,但也不排除有监听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环境下验证的。多谢。

作者:ben0612 发表于2015/3/24 17:11:47 原文链接
阅读:17 评论:0 查看评论

相关 [android 基础 监听] 推荐:

【Android不太基础】换个思路来监听home键

- - CSDN博客推荐文章
一监听返回键或者菜单键的情况比较多,但也不排除有监听home键的需求啊. 监听返回键或者菜单键,可以通过重写activity的dispatchKeyEvent方法,判断event对象的KeyCode值来实现. 虽然android提供了一个常量KeyEvent.KEYCODE_HOME,让我们以为可以监听home键,但其实是不行的.

Android 监听锁屏/开屏事件

- - CSDN博客推荐文章
(1) 监听BroadcastReceiver. (2)获取PowerManager事件. Intent.ACTION_SCREEN_ON : 屏幕点亮 Intent.ACTION_SCREEN_OFF :屏幕关闭 Intent.ACTION_USER_PRESENT: 用户解锁. 监听用户解锁需要在AndroidManifest中注册权限.

Android APP安全测试基础

- - 阿德马Web安全
自从去了新公司之后,工作太忙,变的有点懒了,很久没有更新Blog. 今天跟几个小伙伴一起吃饭,小伙伴提起我的Blog,想想是该更新更新了,就把我投稿给sobug的这篇转过来吧,关于Android app安全测试的基础东东,在Sobug 的url:. 最近这两年移动端真是非常火,每个单位或多或少都会有那么几款App,对于我们Web安全攻城师来说,App安全也需要或多或少的了解一些.

Android基础备忘(android中的分享功能)

- - CSDN博客推荐文章
Android的编程界面相当直截了当,只要了解Activity和View,就可以写出可用的应用. Android是一种手机操作系统,它提供了对各种与联网及通讯相关的支持. 善用这些支持,才能开发出贴近移动应用特点的程序. 在Android的种种编程概念中,尤为值得注意的是Intent. Intent的英文词义是“意图”,而在Android的编程框架里面,也正是体现“想要做某事”的概念.

Android EditText的输入监听,输入字符的动态获取

- - CSDN博客推荐文章
有时候我们可能会用到时时的监听EditText输入字符的时时监听,监听字符的个数,做一些正则表达式的处理等. 我做的是时时的把EditeText输入的数据同步到TextView上. 作者:com360 发表于2012-7-31 11:19:50 原文链接. 阅读:0 评论:0 查看评论.

[转]迈向高阶:优秀Android程序员必知必会的网络基础

- - $firecat的代码足迹$
网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用的工具类,到后来Google开源的比较完善丰富的Volley,再到如今比较流行的 Okhttp、 Retrofit.

监听短信

- - CSDN博客推荐文章
在监听短信在这个功能中,通知观察者的工作已经有别人做好,我们只需要注册一个观察者即可. System.out.println( new Date(date)+" 您收到 " + address +"给你发的一封短信,短信内容为: \n" +body );. 最后千万别忘了在清单文件上加上所需要的相应权限.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.

Git基础

- Wolf - 潘魏增
上个月末在公司内部作了一次《Git基础》的主题分享. 这里把分享内容公布出来,希望对一些朋友有用. 如果之前没有接触过Git,wikipedia上面已经有非常好的介绍. pdf格式:http://panweizeng.com/download/git-basics-meituan.pdf. keynote格式:http://panweizeng.com/download/git-basics-meituan.key.

JavaScript 基础

- - CSDN博客推荐文章
JavaScript可以出现在HTML的任意地方,甚至在之前插入也不成问题,使用标签. 不过要在框架网页中插入的话,就一定要在之前插入,否则不会运行. JavaScript对数据类型要求不严格,一般来说,声明变量的时候不需要声明类型,而且就算声明了类型,在使用过程中也可以给变量赋予其他类型的值,声明变量使用var关键字.