另辟思路解决 Android 4.0.4 不能监听Home键的问题
来源:互联网 发布:从零开始学mt4编程 编辑:程序博客网 时间:2024/03/28 22:21
问题描述:
自从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 @Override15 public void onCreate() {16 super.onCreate();17 application = this;18 }19 20 /**21 * 把Activity和状态放到List中管理22 * 23 * @param activity24 * @param isActivitied25 */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 * @return41 */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键的问题
- 另辟思路解决Android 4.0以后不能监听和屏蔽Home键的问题
- 监听android的Home键
- android Home键的监听
- 监听android的home键
- android Home键的监听
- Android完美解决监听home键
- 监听Android的Home键碰到的问题
- 【Android 一般进阶】换个思路来监听home键
- Home键监听问题
- android监听home键
- android 监听HOME键
- Android 监听Home键
- android Home键监听
- Android 监听Home键
- Android 监听home键
- android HOME键监听
- android home键监听
- 实现一屏幕自适应登陆
- (黑马程序员)学习笔记,枚举
- OCP 1Z0 052 53
- mysql常见优化
- 使用do{ } while(0);
- 另辟思路解决 Android 4.0.4 不能监听Home键的问题
- 一群牛人翻译:The Swift Programming Language 中文版
- TCP滑动窗口机制
- lucene对文件做简单的索引
- 阿什福倒萨戴菲菲抗虫棉的速度vsdvglksdbv克里斯蒂不vsldkbvsksdklsdvk
- MySQL内存使用-全局共享
- poj 3186 Treats for the Cows
- Javascript 初学者应知的 24 条最佳实践
- 利用tom的SHOW_SPACE脚本实验验证表插入删除带来的redo和工作原理