Android中监听Home键的4种方法总结

本文主要介绍了Android中监听Home键的4种方法总结,主要讲解了onSaveInstanceState方法、onUserLeaveHint方法、ACTION_CLOSE_SYSTEM_DIALOGS、framework PhoneWindowManager.java等4种方法,需要的朋友可以参考下:

因为home键是系统键,情况特殊一些。看了一下网上的资料,说下面的方法可以。(其实不行)

代码如下:
@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}

加了权限之后也不行。
复制代码 代码如下:

< uses-permission android:name=“android.permission.DISABLE_KEYGUARD” >

ok~ 下面来说下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;  
        }  
    }  
} 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 可以通过重写 `onKeyDown()` 方法监听 back ,`onUserLeaveHint()` 方法监听 home ,以及通过注册系统广播来监听多任务(最近任务)。 以下是示例代码: 1. 监听 back 在 Service 重写 `onKeyDown()` 方法,判断 keyCode 是否为 KeyEvent.KEYCODE_BACK,即可监听到 back 的点击事件。 ``` @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // 处理 back 点击事件 return true; } return super.onKeyDown(keyCode, event); } ``` 2. 监听 home 在 Service 重写 `onUserLeaveHint()` 方法,即可监听home 的点击事件。 ``` @Override public void onUserLeaveHint() { super.onUserLeaveHint(); // 处理 home 点击事件 } ``` 3. 监听多任务(最近任务) 通过注册系统广播 `Intent.ACTION_CLOSE_SYSTEM_DIALOGS`,即可监听到多任务(最近任务)的点击事件。 ``` private BroadcastReceiver mCloseSystemDialogsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (TextUtils.equals(action, Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (TextUtils.equals(reason, SYSTEM_DIALOG_REASON_RECENT_APPS)) { // 处理多任务点击事件 } } } }; private static final String SYSTEM_DIALOG_REASON_KEY = "reason"; private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; private void registerCloseSystemDialogsReceiver() { IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(mCloseSystemDialogsReceiver, filter); } private void unregisterCloseSystemDialogsReceiver() { unregisterReceiver(mCloseSystemDialogsReceiver); } ``` 在 Service 的 `onCreate()` 方法注册广播,`onDestroy()` 方法注销广播: ``` @Override public void onCreate() { super.onCreate(); registerCloseSystemDialogsReceiver(); } @Override public void onDestroy() { super.onDestroy(); unregisterCloseSystemDialogsReceiver(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值