您的位置:首页 > 移动开发 > Android开发

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

2015-12-22 23:42 393 查看
这几天一直搞团队的项目,客户说明要在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事件的,或许也有其他的方法、、、、



----------------------------ljz2009y
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: