android HOME、back(按钮、事件)截取获得,综合解决方案和分析,包含android4.0系统


这几天一直搞团队的项目,客户说明要在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这个对象来进行操作界面,来死锁界面,这样一来可以屏蔽HOMEBACK事件了,但是界面上面其他的所有的事件(包含按钮点击)也被屏蔽了,所以不适合项目里面使用,所以就放弃了。。。。


 

 

 

二、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事件,我之前也不相信谷歌会开发这个操作,但是我看见了客户录下了一个应用,点击HOMEback按钮,确确实实没有退出去,也没有什么弹出选择框和延迟的、、、所以我相信了,可以屏蔽HOME事件的,或许也有其他的方法、、、、

 

六、有思路的哥哥姐姐,这个就等你们的回复了,小弟在此等这的、、、、

 

 

 

如果有需要或者不懂的,尽量留言哈,谢谢观看、、、、

 

 

 

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值