zoukankan      html  css  js  c++  java
  • 另辟思路解决 Android 4.0.4 不能监听Home键的问题

    问题描述:

      自从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

  • 相关阅读:
    奇数阶魔方问题
    《DSP using MATLAB》示例9.3
    《DSP using MATLAB》示例9.2
    《DSP using MATLAB》示例9.1
    找个目标很重要
    《DSP using MATLAB》示例Example 8.30
    《DSP using MATLAB》示例Example 8.29
    《DSP using MATLAB》示例Example 8.28
    《DSP using MATLAB》示例Example 8.27
    《DSP using MATLAB》示例Example 8.26
  • 原文地址:https://www.cnblogs.com/youngforlife/p/3936653.html
Copyright © 2011-2022 走看看