转载请标明: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();
}