Android 监听Back、Home按键

在Android开发中,我们监听用户点击返回键事件,通常是以下两个方法:

//方法1
@Override  
public void onBackPressed() {  
	//do something  
	//super.onBackPressed();  
}  
//方法2 
@Override  
public boolean onKeyDown(int keyCode, KeyEvent event) {  
	if(keyCode == KeyEvent.KEYCODE_BACK){  
		//do something  
		return true;
	}  
	return super.onKeyDown(keyCode, event);  
} 

于是乎,我们理所当然的想到,监听HOME键的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。但实际上,这样是行不通的,因为HOME键的消息在framework层就已经被拦截,官方文档原文是这么说的:
int android.view.KeyEvent.KEYCODE_HOME = 3 [0x3]
Key code constant: Home key. This key is handled by the framework and is never delivered to applications. 
所以,我们在应用中通过此方法是无法监听到HOME键的消息的。那么我们如何捕获HOME键事件,并作出相应处理呢?其实系统还是给我们发出广播的,我们可以通过注册广播接受者来监听Home按键事件的方法:

package com.example.homekeydemo;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

	private static final String TAG = MainActivity.class.getSimpleName();
	private HomeKeyRecevier mHomeKeyRecevier;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	 
	@Override
	protected void onResume() {
		
		Log.i(TAG, "onResume");
		
		processLogic();
		
		super.onResume();
	}

	private void processLogic() {
		IntentFilter mFilter = new IntentFilter(
				Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
		mHomeKeyRecevier = new HomeKeyRecevier();
		registerReceiver(mHomeKeyRecevier, mFilter);
		
		Log.e(TAG, "register HomeKeyRecevier");
	}

	@Override
	protected void onPause() {
		
		Log.i(TAG, "onPause");
		
		try {
			unregisterReceiver(mHomeKeyRecevier);
		} catch (Exception e) {
			e.printStackTrace();
		}
		super.onPause();
	}

	/**
	 * 广播接收者
	 */
	class HomeKeyRecevier extends BroadcastReceiver {
		final String SYSTEM_DIALOG_REASON_KEY = "reason";
		final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
		final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
		final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
				String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
				if (reason != null) {
					Log.e(TAG, "action:" + action + ",reason:" + reason);

					if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
						// 短按home键
						Log.i(TAG, "HOME_KEY click");
						
					} else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
						// 长按home键
						Log.i(TAG, "RECENT_APPS click");
					}
				}
			}
		}
	}
}

Android 2.X和Android 4.X系统测试通过没有问题,网上搜索还有以下处理方法:

@Override
public void onAttachedToWindow() {
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
     super.onAttachedToWindow();
}

在Android 2.X系统上运行没问题,但是在Android 4.X系统上不起作用,大家可以试试。

这里只是监听到HOME按键事件,但是如何屏蔽掉HOME按键事件还没找到相关的方法,如果有哪位仁兄知道的话,可以通过留言回复一下我,万分感谢!




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值