`

Android处理Home键方法小结

阅读更多

昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。

看了一下网上的资料,说下面的方法可以。(其实不行)

 @Override
    public void onAttachedToWindow() {
        // TODO Auto-generated method stub
        Log.d("aeon","onAttachedToWindow");
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
        super.onAttachedToWindow();
    }

加了权限之后也不行。

 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" >
    </uses-permission>

  

 

实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:

 

方法1:onSaveInstanceState方法

  下面这个方法可以处理home的监听问题。

protected void onSaveInstanceState(Bundle outState)

  但这个方法不是很好,不推荐

 

 

方法2:onUserLeaveHint方法

 

@Override
    protected void onUserLeaveHint() {
        Log.d("aeon","onUserLeaveHint");
        super.onUserLeaveHint();
    }

  

这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。

 

方法3:ACTION_CLOSE_SYSTEM_DIALOGS

 

在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS

 

 

//注册Receiver
 
              HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();
             registerReceiver(receiver, new IntentFilter(
                           Intent. ACTION_CLOSE_SYSTEM_DIALOGS));

 

方法4:framework PhoneWindowManager.java 处理

 

想要完全监听home键需要在framework层去处理。

/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

里面去修改private void handleLongPressOnHome() 这个方法。

 

private void handleLongPressOnHome() {
        // We can't initialize this in init() since the configuration hasn't been loaded yet.
        if (mLongPressOnHomeBehavior < 0) {
            mLongPressOnHomeBehavior
                    = mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);
            if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
                    mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
                mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
            }
        }

        if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {
            performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
            sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);

            // Eat the longpress so it won't dismiss the recent apps dialog when
            // the user lets go of the home key
            mHomeLongPressed = true;
        }

        if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
            showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
        } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
            try {
                IStatusBarService statusbar = getStatusBarService();
                if (statusbar != null) {
                    statusbar.toggleRecentApps();
                }
            } catch (RemoteException e) {
                Slog.e(TAG, "RemoteException when showing recent apps", e);
                // re-acquire status bar service next time it is needed.
                mStatusBarService = null;
            }
        }
    }

  只要把handleLongPressOnHome里面做出相对应的处理就ok

 

 

 

 

 

1
2
分享到:
评论
2 楼 北极光之吻 2013-06-21  
须等待 写道
onSaveInstanceState不等同于按home键吧?还有其他的行为也会调用这个方法

是的,这个方法也可以。onUserLeaveHint
1 楼 须等待 2013-06-18  
onSaveInstanceState不等同于按home键吧?还有其他的行为也会调用这个方法

相关推荐

    Android学习小结之Activity保存和恢复状态

    Android中启动一个Activity如果点击Home键该Activity是不会被销毁的,但是当进行某些操作时某些数据就会丢失,如下: Java class: package com.king.activitytest2; import android.support.v7.app....

    最新的Android4.0模拟器教程.doc

    #### 四、小结 通过以上步骤,您已经成功地在电脑上安装了Android 4.0模拟器。该模拟器不仅能够帮助开发者进行应用程序的开发与测试,同时也能够让普通用户提前体验到这一版本带来的新功能和改进。尽管Android 4.0...

    Android SDK下载安装及配置教程

    ### 小结 总之,Android SDK下载安装及配置是一个相对复杂的步骤,它需要开发者了解Java开发环境的搭建,并且在搭建Android开发环境时可能会遇到网络访问限制的问题。整个配置过程需要细心和耐心,但通过正确的方法...

    Android编程实用技术小结

    Android编程实用技术小结涵盖了几个关键的Android开发知识点,主要包括开机启动BroadcastReceiver、Service的使用以及AlarmManager的管理。以下是对这些技术的详细说明: 1. **开机启动Receiver**: 开机启动...

    Android开发中Activity属性设置小结

    4. **android:configChanges**:指定哪些配置变化会导致Activity的`onConfigurationChanged()`方法被调用,如屏幕方向、导航方式或语言更改等。如果不想因为配置改变而重新创建Activity,可以手动处理这些变化。 5....

    android GPS架构之GPS的开启与关闭

    八、小结 Android GPS 架构中的 GPS 开启与关闭需要了解普通应用程序启动 GPS 设备的代码实现、Settings.Secure.setLocationProviderEnabled 的调用过程、数据库写入过程、Android 启动过程等相关知识点。只有掌握...

    Google Android开发入门与实战的代码

    1.6 本章小结 6 第2章 工欲善其事 必先利其器——搭建Android开发环境 7 2.1 开发Android应用前的准备 7 2.1.1 Android开发系统要求 7 2.1.2 Android软件开发包 7 .2.1.3 其他注意事项 8 2.2 ...

    Android分享微信小程序失败的一些事小结

    在Android平台上,分享微信小程序可能遇到一些挑战,但只要遵循正确的步骤和注意事项,这些问题是可以解决的。本文将针对“Android分享微信小程序失败”的常见问题进行分析,并提供解决方案。 首先,集成微信小程序...

    Android获取与设置系统环境变量的方法指南

    小结 本文详细介绍了 Android 获取与设置系统环境变量的方法指南,包括在 Android 源码环境下增加环境变量和在 Android 终端下查看和修改环境变量。学会了这些方法,我们就可以在分析 Android 源码中通过 adb 命令...

    新版Android开发教程&笔记三--环境搭建与解析 .pdf

    #### 五、小结 通过上述步骤,你可以成功地搭建起一个基本的Android开发环境,并能够创建和管理虚拟设备。这将为后续的Android应用开发奠定坚实的基础。随着技术的发展,建议关注最新的开发工具和技术栈,以便更好...

    Android开发环境配置

    #### 七、小结 通过上述步骤,您已经成功配置了一个基本的Android开发环境。接下来可以进一步学习Android编程的基础知识,开始开发自己的Android应用程序。此外,还可以考虑使用其他先进的开发工具,如Android ...

    在Windows下搭建Android2.2开发环境

    #### 七、小结 通过以上步骤,您已经成功地在Windows环境下搭建了一个完整的Android 2.2开发环境,并运行了第一个Android应用程序。接下来,您可以进一步探索Android SDK提供的更多示例和文档,加深对Android开发的...

    Android环境搭建详细图解

    #### 小结 通过上述步骤,初学者可以顺利地搭建起一套完整的Android开发环境。这一系列的操作不仅包括了软件的安装,还涉及到了环境变量的配置,以及虚拟设备的创建。对于初学者来说,这些步骤可能会有些繁琐,但是...

    Android源码的编译-教程[参考].pdf

    小结 本文档提供了一个详细的教程,指导读者从零开始编译Android源码。编译Android源码需要具备一定的编程基础和Linux操作系统的使用经验。同时,需要正确地设置环境变量和安装Java环境。只有具备了这些环境,才能...

    Gradle的缓存路径修改的四种方法(小结)

    gradle.user.home=D\:\\Android\\.gradle 但这种方法,需要每个项目文件都要改一遍,如果只是临时修改,可以采用这种方法,如果是针对所有项目的,不建议这种方法. 方法二,在Android Studio中修改gradle用户目录,...

Global site tag (gtag.js) - Google Analytics