这几天一直搞团队的项目,客户说明要在android4.0上面必须要输入密码才能退出应用,也就说在android上面点击BACK按钮和HOME按钮都要截取到这个事件,然后在进行相关的操作,提示用户输入密码,这样子才可以退出。
但是这些天一直才资料,什么百度都弱爆了,谷歌才是真正的厉害啊,查到了好多可以用资料,最后没有办法然后去查了外国的网站,才解决了这些问题。
好了,言规正传,
首先先说BACK事件的监听:
一般大家使用截取BACK事件:用的是这个:
@Override
public boolean onKeyDown(int keyCode,KeyEvent event)
{
if( keyCode ==KeyEvent.KEYCODE_BACK )
{
//to-do
return true;
}
returnsuper.onKeyDown(keyCode, event);
}
使用这个,没有任何问题,在andorid1.6至android4.0都是可以用的,所以就解决问题的一半
在说HOME事件的监听:
在android2.2到android3.2使用:一下代码就可以截取HOME事件:
1. public void onAttachedToWindow()
2. {
3. this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
4. super.onAttachedToWindow();
5. }
在AndroidManifest.xml里面加上权限<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
好了,这样子就可以截取HOME事件了。
但是在android4.0上面,使用如下代码,就会报错:
错误信息如下:
java.lang.IllegalArgumentException: Window type can not be changedafter the window is added.
这个问题,我也拿去谷歌了,还是没有找到解决方法,希望有那些大牛,看到了就回我帖子吧,解决小弟的疑问,问什么相同代码添加在4.0就会报错。。。
没有办法啊,纠结死了,继续去查资料,现在总结一下,我找到有用的资料吧:
一、WindowManager的使用
http://blog.csdn.net/tody_guo/article/details/7526121
这个博客,里面也说明了,HOME截取事件在4.0平台上面,不可以使用的问题,他也提出了一个自己的代码,通过是使用WindowManager这个对象来进行操作界面,来死锁界面,这样一来可以屏蔽HOME和BACK事件了,但是界面上面其他的所有的事件(包含按钮点击)也被屏蔽了,所以不适合项目里面使用,所以就放弃了。。。。
二、Launcher的使用
http://stackoverflow.com/questions/3898876/how-to-disable-the-home-key
这个网页,里面就是在配置文件中,添加4句话就OK了。
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.HOME"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<categoryandroid:name="android.intent.category.MONKEY"/>
这个原理就是使用新建一个Launcher ,这样点击HOME的时候,系统就会提示说:选择一个Launcher ,分别是系统自带的(主界面)和我们自己写的程序的选项。所以只要点击的了提示框的下标,那么就可以点击HOME一直回到主界面咯(需要写一个static变量来控制界面的产生个数,不然会无限这多的activity出现,直到内存需要清理的时候)。
同时需要注意的是:重启模拟器后,第一次出现的界面还是会提示选择Launcher 的对话框。这个是由于Launcher 是系统第一个activity,系统本来就有一个,现在我们新加了一个Launcher ,所以就需要用户来选择使用哪一个Launcher 的界面了三、、、
有的牛人,也说了就是重新写系统的代码,删掉系统自带的Launacher,然后重新烧系统、、、
小弟表示初学android来不起,暂时不会,也没有测试过的、、、、
三、监听HOME事件
想不到啊,想不到,android4.0上面居然还有监听HOME事件的。其实也不是仅仅监听HOME事件的,他监听的是,activity离开的事件:
所以只需要重写activity下面的:就可以监听咯
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
System.out.println("onUserLeaveHint");
}
团队的项目解决就用了一个比较213的方法,就是当判断用户是点击HOME的离开事件之后,添加这写语句:
Intent intent = new Intent(this,还是这个ACTIVITY的类名.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
this.startActivity(intent);
这样子,不管用户点击多少次HOME,最后都会回到主界面去的,只是中间会有一些间隔时间(但是在真机上面,这个间隔时间还是比较短的,就要看真机上面的内存和CPU的反应速度咯)
四、网上有的说:就重写PhoneWindowsManager.java这个类,关于处理HOME事件的处理方法,然后重新编译为jar包,在导入到工程进去,这个方法,我没有测试过,但是觉得或许可以。。。只希望做过类似运用的哥哥姐姐给点指导咯,小弟在此感激不尽的、、
五、关于能不能屏蔽HOME事件,我之前也不相信谷歌会开发这个操作,但是我看见了客户录下了一个应用,点击HOME和back按钮,确确实实没有退出去,也没有什么弹出选择框和延迟的、、、所以我相信了,可以屏蔽HOME事件的,或许也有其他的方法、、、、
六、有思路的哥哥姐姐,这个就等你们的回复了,小弟在此等这的、、、、
如果有需要或者不懂的,尽量留言哈,谢谢观看、、、、