Android虚拟键-HOME、RECENT、BACK

Android虚拟键-HOME、RECENT、BACK

由于项目需要,在虚拟键上折腾了不少时间,写下来总结一下,也给同样困惑的小伙伴一些启示。

Home、Recent键的监听

直接上代码:

 //监听HOME键、RECENT键
    private IntentFilter mHomeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    private BroadcastReceiver mHomeListenerReceiver = new BroadcastReceiver() {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
        private final String SYSTEM_RECENT_APPS = "recentapps";//最近使用的应用键

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
                    && null != reason) {
                if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {//按下Home
                    //你的操作
                } else if (reason.equals(SYSTEM_RECENT_APPS)) {//按下Recent,这个方法会调两次
                    //你的操作
                }
            }
        }
    };

使用时调用:

this.registerReceiver(mHomeListenerReceiver, mHomeFilter);//注册

记得在不用的时候:

this.unregisterReceiver(mHomeListenerReceiver);//删除

Back键的监听

直接上代码:

  view.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {//Back键
                   //你的操作
                }
                return false;
            }
        });

这个View:

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.KeyEvent;

/**
 * 浮窗View
 * Created by weifeiyang on 2017/2/6.
 */

public class FloatingWindowView extends CoordinatorLayout {
    public FloatingWindowView(Context context) {
        super(context);
    }

    public FloatingWindowView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FloatingWindowView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (mOnKeyListener != null) {
                mOnKeyListener.onKey(this, KeyEvent.KEYCODE_BACK, event);
                return true;
            }
        }

        return super.dispatchKeyEvent(event);
    }

    OnKeyListener mOnKeyListener = null;

    @Override
    public void setOnKeyListener(OnKeyListener l) {
        mOnKeyListener = l;
        super.setOnKeyListener(l);
    }
}

需要注意的是,通过广播监听的事件,是没办法截取的,只能使用来处理自己的事件
在开发过程中,使用WindowManager搭起的View通过这种方式去处理虚拟键的事件。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值