Android4.X物理按键监听

转载请标明:http://blog.csdn.net/inquisitive_plus/article/details/45024819 有问题欢迎提出,共同学习

测试环境:Android4.2,系统华为,未root

Android系统有很多物理按键,我们的程序中可能或多或少的需要去监听甚至是拦截他们。下面是对按键监听的代码,有的通过onKeyDown就可以监听或拦截,而另一些只能通过获取广播去监听。

通过获取广播监听的按键目前都是无法拦截的,这样既能让开发者获知事件的发生,也能防止恶意程序。

广播类型的按键消息:锁屏(单击电源键)、解锁、开屏、home键和长按菜单键

    MyBroadCast lh;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        IntentFilter mIntentFilter = new IntentFilter(
                Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        mIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
        mIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        mIntentFilter.addAction(Intent.ACTION_USER_PRESENT);
        lh = new MyBroadCast();
        registerReceiver(lh, mIntentFilter);

    }

    class MyBroadCast extends BroadcastReceiver {
        public static final String ACTION_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            
            if (ACTION_DIALOGS.equals(action)) {

                String reason = intent.getStringExtra("reason");
                if (reason != null) {
                    if (reason.equals("homekey")) {
                        MainActivity.getToast(context, "home键");
                    } else if (reason.equals("recentapps")) {
                        MainActivity.getToast(context, "长按菜单");
                    } 
                }

            }else if (Intent.ACTION_SCREEN_ON.equals(action)) {
                System.out.println("开屏");
            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                System.out.println("锁屏");
            } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
                System.out.println("解锁");
            }
        }

    }
如果手机未设置锁屏,解锁的广播会在开锁的广播之前接受。

单击菜单键、Back键、增加音量和减少音量、还有长按电源键。其中长按电源键无法拦截,其他按键事件可以通过返回true来进行拦截。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_MENU:
            getToast(this, "KeyEvent.KEYCODE_MENU");
            return true;
        case KeyEvent.KEYCODE_BACK:
            getToast(this, "KeyEvent.KEYCODE_BACK");
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            getToast(this, "KeyEvent.KEYCODE_VOLUME_DOWN");
            return true;
        case KeyEvent.KEYCODE_VOLUME_UP:
            getToast(this, "KeyEvent.KEYCODE_VOLUME_UP");
            return true;
        case KeyEvent.KEYCODE_POWER:
            getToast(this, "KeyEvent.KEYCODE_POWER");
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    /**
     * 工具方法:输出Toast
     * @param context
     * @param str
     */
    public static void getToast(Context context, String str) {
        Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值