Android项目开发中经常需要处理Home键,home键在应用层是无法捕捉也是不应该捕捉的。每层都有每层具体的分工。

一般项目要求我们对Home键要做处理,而我们又无法在应用层捕捉到这个按键操作。

1. 如果你只是想屏蔽 home 键,让它无所作为,那么祝贺你,你是可以做到的

常用方法:

private boolean catchHomeKey = true;
 @Override
 public void onAttachedToWindow() {
 // TODO Auto-generated method stub
 if(catchHomeKey) {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); //bug的缘由
 }
 super.onAttachedToWindow();
 }

这样就可以做到完全屏幕了,

当然你如果想通过 :

@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {
 return false;
 }
 if(keyCode == KeyEvent.KEYCODE_HOME) {
 System.out.println("----- !!! I am home !!!! ----");
 //写你的处理逻辑 (htc g8 2.1系统可以到达这里,2.2以上的就不可以到达这里)
 }

 return super.onKeyDown(keyCode, event);
 }
 
)

这种方法来监听它,那么你是做不到的!而且这将会带来另一个问题,你的全屏设置失效了,试试,按一下电源键,让手机黑屏,再按一下进去,你会发现标题栏不会自动消失!


所以可以总结出:要想全屏,那么上面的home键处理方法是不能采用的!



2.如果你想在用户按下Home键的时候,自己的应用有所作为,那也是可以做到的!


我们其实只是需要知道“用户什么时候按下Home键?”,当你知道用户按下之后 ,你就可以做一些这时候你应该做的事情。那么,如何知道用户什么时候按下Home键???


换一种思维方式,答案很简单,监听logcat日志,看到有

I/ActivityManager( 144): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher } from pid 144

这样的输出信息,你就可以知道用户按下了Home键,你在程序中可以监听logcat,当发现用户的这一操作时,你就可以暂停背景音乐(做一些你应该做的事情)。然后当用户再一次打开app的时候,logcat一般会输出:


11-04 10:17:38.427: INFO/ActivityManager(144): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.XXX.XXXX/.activity.WelcomeActivity bnds=[12,76][132,211] } from pid 237


然后你就可以再次播放音乐了!(哈哈,太好了,终于成功了)

注意:在删选logcat日志的时候,你要应该过滤,使用 tag , pid,项目名,这些有效信息来快速过滤。







----------补充说明:

在模拟器上,输出的日志格式略有不同,不知道是不是每一部器机输出格式是不是都有一些差别:

11-04 14:07:22.156: INFO/ActivityManager(59):Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher }


11-04 14:17:38.256: INFO/ActivityManager(59): Starting activity: Intent