zoukankan      html  css  js  c++  java
  • Android中捕获Home事件的终极解决方案

    本文转自http://www.alnton.com/?p=128

    Android设计者处于安全考虑,那个home键在应用层是捕获不到的,只有修改底层的代码才可以获取其事件监听,但是修改底层对于应用开发者来说有点麻烦,那如何在Activity层监听到home键哪?

    先禁止Home键,再在onKeyDown里或者dispatchKeyEvent处理按键值,点击Home键的时候就把程序最小化,或者随你的需求。

    首先第一步:

    加权限禁止Home键

    <uses-permission android:name=”android.permission.DISABLE_KEYGUARD” />

    大家不要以为添加这个权限后,所有的Activity的Home键都不可以用了,反而添加这个权限后,跟不添加是一样的效果,就是所有的Activity的Home键都没有禁止,如果你想对某个Activity禁止Home的事件,那么你只需要在某个Activity中加上此方法:

    @Override
    public void onAttachedToWindow()
    { 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
    }

    这个时候,此Activity的Home键才被禁止掉,那么在此Activity中做如下操作,即可最小化应用,或者你自己添加需求的代码。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
    if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_HOME)
    {
    // 最小化应用
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
    return true;
    }
    return super.onKeyDown(keyCode, event);
    }

    呵呵,至此,我高兴的很,屁颠屁颠的去测试了,先用模拟器测试没有问题,再用真机测试,我去,问题又出现了,Home事件截获不到,这是为什么啊?大家不要急,听我慢慢道来。在2.2以前的模拟器用上述方法是没有问题,但是从3.0开始后的模拟器就不行了包括真机。反正我用了几款机子测试是不行的,哪如何解决此问题哪?

    大家都知道点击Home触发onPause、onStop这两个方法,在模拟器测试都触发,但是一旦到真机测试有些机子都触发,但是有些机子就不触发onStop,或者如果你安装了360软件后,一般都不触发,当你从通知栏拉下后在点击又触发了onStop所以我们一般在onPause方法里截获Home事件然后处理,这种截获方式用Logcat。没错就是用Logcat.

    终极解决方案开始:

    1.首先你要在AndroidManifest.xml添加一项读取系统Log的权限

    <!– 允许程序读取系统日志 –>
    <uses-permission android:name=”android.permission.READ_LOGS” />

    2.

    /**
    * “logcat”不用说了吧,我们就是要监听它 
    * “ActivityManager” 表示监听的Tag 这里以上面点击按钮输出的LOG信息为例。
    * “I”表示监听的Log类型,当然这里还可以写其它类型 。VERBOSE(v) 、DEBUG(d)、 INFO(i)、 WARN(w)、 ERROR(e), 不过须要与监听的与Tag一一对称才可以。
    * “*:s”表示监听所有的信息,这里表示只要tag是ActivityManager ,Logcat类型为i 的 所有Log都会被获取到。
     * 点击Home时会触发OnPause、onStop但是在某些手机上可能触发onStop延迟或者不触发
    */
    new Thread(new Runnable()
    {
    @Override
    public void run()
    {
    Process logcatProcess = null;
    BufferedReader bufferedReader = null;
    try
    {
    /** 获取系统logcat日志信息 */
    logcatProcess = Runtime.getRuntime().exec(new String[] {“logcat”, “ActivityManager:I *:S”});
    bufferedReader = new BufferedReader(new InputStreamReader(logcatProcess.getInputStream()));
    String line;
    while ((line = bufferedReader.readLine()) != null)
    {
    if (line.indexOf(“cat=[android.intent.category.HOME]“) > 0)
    {
    /** 这里可以处理你对点击Home的操作哦 我这里是完全退出应用*/
    Session.exit();
    }
    }
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    }).start();

    到这里大家看明白了没。就是监听系统日志。

    手机点击HOme的日志是:

    Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0×10200000 cmp=com.dianxinos.dxhome/com.dianxinos.launcher2.Launcher } from pid 1277

    模拟器是:

    Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0×10200000 cmp=com.android.launcher/com.android.launcher2.Launcher }

    他们的

    Level:I
    PID:59
    Application:system process
    Tag:ActivityManager

    他们都有一个共同点都有:cat=[android.intent.category.HOME]

    呵呵。。。。结束了哦

     

     

     

  • 相关阅读:
    ubuntu 18.04 修改 固定ip
    java 加载properties
    Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1
    免费申请一年版Eset NOD32 Antivirus激活码(无限制)- 已失效
    微软软件运行库下载
    Bitdefender Total Security 2014 Free 6 Months & 12 month License Key
    如何将Virtualbox和VMware虚拟机相互转换[译文211]
    Virtualbox安装Windows 8.1遇到0x000000C4错误解决办法
    VirtualBox 4.3“不能为虚拟电脑 打开一个新任务”解决方案
    docx文件怎样打开
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/2750028.html
Copyright © 2011-2022 走看看