Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 370|回复: 0

另辟思路解决Android 4.0以后不能监听和屏蔽Home键的问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-25 14:12:25 | 显示全部楼层 |阅读模式

    问题描述:

      自从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 }
    View Code

      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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-12 00:54 , Processed in 0.060278 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表