问题描述:

  自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下:

Home key. This key is handled by the framework and is never delivered to applications.

所以,除非修改Framework,都不能直接监听Home键了,网上有朋友说监听Log日志,但是现在按Home键是不显示Log日志的,而且不同的手机型号即使显示也不会一样。

  在网上找了好多方法都没有解决……无奈啊。

  为了实现用户按了Home键之后处理事件,被逼的另辟蹊径 使用下面的解决方案了。

解决方案:

  1.思路

    Activity的生命周期中,

    

    每一个Activity在启动的时候都要走(执行)OnResume()方法,而且,每一个Activity在被结束的时候都要走OnStop方法,并且,用户在按Home键之后Activity也是要执行Onstop()方法(看图,图上说Activity不可见的时候就执行)。

    所以,我们可以在每一个Activity的OnStop()方法中,判断一下所有的Activity的状态,如果所有的Activity都不可见的时候(都执行过OnStop()),执行我们想要做的操作。

  2.逻辑

    自定义Application,在其中定义一个全局的HashMap,定义两个方法,方法一addActivityStatus(Activity activity)用来管理Activity的状态,方法二 isAllActivityAlive()用来查询是否所有的Activity都处于激活状态。

    在每一个Activity中的OnResume()方法中,调用addActivityStatus(Activity activity)把当前的Activity的状态设置为true激活状态,在OnStop()方法先调用addActivityStatus(Activity activity)把状态设置成false非激活状态,然后调用isAllActivityAlive()查看是不是所有的Activity处于非激活状态,如果都是非激活状态(所有的Activity都执行过OnStop()),那就执行你想要做的操作!!!

    写的好乱啊...

  3.实现

  1.自定义Application

 1 package com.houny.testhomekey.application;
2
3 import java.util.HashMap;
4 import java.util.Iterator;
5 import java.util.Map;
6
7 import android.app.Activity;
8 import android.app.Application;
9
10 public class ManageApplication extends Application {
11 private HashMap<String, Boolean> mapActivity = new HashMap<String, Boolean>();// 用于存储activity对应的激活状态
12 private static ManageApplication application = null;
13
14 @Override
15 public void onCreate() {
16 super.onCreate();
17 application = this;
18 }
19
20 /**
21 * 把Activity和状态放到List中管理
22 *
23 * @param activity
24 * @param isActivitied
25 */
26 public void addActivityStatus(Activity activity, boolean isAlive) {
27
28 if (mapActivity.containsKey(activity.getClass().getName())) {
29 mapActivity.remove(activity.getClass().getName());
30 mapActivity.put(activity.getClass().getName(), isAlive);
31 } else {
32 mapActivity.put(activity.getClass().getName(), isAlive);
33 }
34
35 }
36
37 /**
38 * 判断是否有Activity是活动状态
39 *
40 * @return
41 */
42 public boolean isAllActivityAlive() {
43 boolean res = false;
44 Iterator iter = mapActivity.entrySet().iterator();
45 while (iter.hasNext()) {
46 Map.Entry entry = (Map.Entry) iter.next();
47 Object key = entry.getKey();
48 boolean value = (Boolean) entry.getValue();
49 if (value) {
50 return true;
51 }
52 }
53
54 return res;
55 }
56
57 public static ManageApplication getInstance() {
58 return application;
59 }
60 }

  2.在 Mainfest中把Application设成自定义的Application

<application
android:name="com.houny.testhomekey.application.ManageApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

  3.在每一个Activity中都做如下操作

    3.1 在OnCreat()中getApplication

    

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
application = (ManageApplication) this.getApplication();
setContentView(R.layout.activity_main); Log.e("Status", "OnCreate");
findViewsById();
setViewsListener();
}

    3.2 重写OnResume(),增加当前Activity的状态为true激活状态

    

@Override
protected void onResume() {
Log.e("Status", "onResume");
application.addActivityStatus(MainActivity.this, true);
super.onResume();
}

    3.3 重写OnStop(),更改当前Activity的状态为false非激活状态并判断所有的Activity是否都处于非激活状态

    

@Override
protected void onStop() {
Log.e("Status", "onStop");
application.addActivityStatus(MainActivity.this, false);
boolean alived = application.isAllActivityAlive(); Log.e("All Activity Status", alived + ""); if(!alived){
//TODO 想要进行的操作
}
super.onStop();
}

OK!!!大功告成!o(∩_∩)o

另辟思路解决 Android 4.0.4 不能监听Home键的问题的更多相关文章

  1. Android 优雅的让Fragment监听返回键

    Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentAc ...

  2. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  3. 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  4. 我的Android进阶之旅------&gt;怎样解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->怎样解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  5. Android 监听返回键退出程序的两种实现

    1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...

  6. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...

  7. android 监听返回键

    android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...

  8. 【Android】Android实现监听返回键,主键(HOME),菜单键

    目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...

  9. Android 监听返回键、HOME键

    拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...

随机推荐

  1. IOS 读取本地的Json/plist 文件

    一.一般本地可以存储轻量级数据存储 plist  这个主要是操作字典 方法如下: NSString * sampleFile= [[[NSBundle mainBundle] bundlePath] ...

  2. UITableView  折叠效果

    1:创建一个model数据模型 #import <Foundation/Foundation.h> @interface DataModel : NSObject //保存section中 ...

  3. [经典算法] Eratosthenes筛选求质数

    题目说明: 除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个著名的 Eratosthenes求质数方法. 题目 ...

  4. 《算法导论》习题解答 Chapter 22.1-3(转置图)

    一.邻接表实现 思路:一边遍历,一边倒置边,并添加到新的图中 邻接表实现伪代码: for each u 属于 Vertex for v 属于 Adj[u] Adj1[v].insert(u); 复杂度 ...

  5. 重构8-Replace Inheritance with Delegation(委托替换继承)

    继承的误用十分普遍.它只能用于逻辑环境,但却经常用于简化,这导致复杂的没有意义的继承层次.看下面的代码: public class Sanitation{ public String WashHand ...

  6. Oracle 常用的SQL语法和数据对象

    一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……);  INSE ...

  7. Atmega8型号细分区别

    TMEGA8L- 8PU.ATMEGA8L-8PI.ATMEGA8L-8PC.ATMEGA8-16PU.ATMEGA8-16PI.ATMEGA8-16PC. ATMEGA8L-8AU.ATMEGA8L ...

  8. 转VS快捷键

    “文本操作”快捷键 命令名 快捷键 说明 编辑.折叠到定义 Ctrl + M,Ctrl + O 自动确定在代码中创建区域的逻辑边界(如过程),然后隐藏它们. 编辑.注释选定内容 Ctrl + K,Ct ...

  9. Filter的执行顺序及实例

    学习中的收藏,该文出自http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html 在此,非常感谢该文章作者的分享,本文完全转载自上面链接, ...

  10. JavaScript作用域(链)学习笔记

    作用域是javascript老生常谈的问题,在面试题中也经常出现.此文记录本人对js作用域的理解.从以下三个方面深入探讨js作用域和js作用域链. 1.什么是作用域? 2.什么是作用域链? 3.常见面 ...