Android--捕获HOME建


转载:http://blog.csdn.net/junjx/article/details/7798063

 近日手上有一个项目,要实现按下HOME键,来停止背景音乐,我就想能不能监听HOME键,来做我想要做的事情。到网上一搜,还真的可以。证明了我的想法是正确的。心里暗暗乐了一下。监听HOME建在Android上可以有两种方法。

第一种方法:此方法在Android 4.0以上不可取。

     1.在AndroidManifest.xml中加上权限,禁止HOME键。

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

    2.重载以下两个方法

[java]  view plain copy
  1.   
[java]  view plain copy
  1. @Override  
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.     if(KeyEvent.KEYCODE_HOME==keyCode){  
  4.         //写要执行的动作或者任务  
  5.         doSomething();  
  6.     }  
  7.    return super.onKeyDown(keyCode, event);  
  8. }  
  9. @Override  
  10.  public void onAttachedToWindow(){  
  11.     this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  
  12.     super.onAttachedToWindow();  
  13.  }  

可是我的程序需要在4.0以上的平台运行,那么要怎么办呢?

第二种方法:捕获系统日志,如果我们留意观察就可以发现,当我们按下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

这样我们只要捕获logcat的信息就能监听到HOME键了。

1.    加权限:

       <uses-permission android:name="android.permission.READ_LOGS"/>

2.    捕获logcat信息

[java]  view plain copy
  1. //监听HOME键,听着音乐服务。  
  2. public void listenerHome() {  
  3.         new Thread(new Runnable() {  
  4.             public void run() {  
  5.                 Process mLogcatProc = null;  
  6.                 BufferedReader reader = null;  
  7.                 try {  
  8.                     /* 获取logcat信息 
  9.                      * logcat:日志类型为logcat 
  10.                      * ActivityManager日志Tag为ActivityManager 
  11.                      * I:<span style="font-size:16px;">logcat的标识分为:(V</span> :Verbose<span style="font-size:16px;"> D </span>:Debug<span style="font-size:16px;"> I</span> :Info<span style="font-size:16px;"> W</span> :Warning<span style="font-size:16px;"> E</span> :Error<span style="font-size:16px;">  
  12.                                     * F</span> :Fatal<span style="font-size:16px;"> S</span> :Silent)这里I代表Info。 
  13.                      * *:S:日志的所有内容 
  14.                      */  
  15.                     mLogcatProc = Runtime.getRuntime().exec(  
  16.                             new String[] { "logcat""ActivityManager:I *:S" });  
  17.   
  18.                     reader = new BufferedReader(new InputStreamReader(  
  19.                             mLogcatProc.getInputStream()));  
  20.                       
  21.                     String line;                    
  22.                     while ((line = reader.readLine()) != null) {  
  23.                         if (line.indexOf("android.intent.category.HOME") > 0) {  
  24.                                 Looper.prepare();  
  25.                                 //bgmusic_playler.stop();  
  26.                                 Mp3PlayerService.this.stopSelf();  
  27.                                 Runtime.getRuntime().exec("logcat -c");  
  28.                                 Looper.loop();  
  29.                                   
  30.                                 break;  
  31.                         }  
  32.                     }  
  33.   
  34.                 } catch (Exception e) {  
  35.   
  36.                     e.printStackTrace();  
  37.                 }  
  38.             }  
  39.         }).start();  
  40.     }  

开始用了第一种方法,加班加到2点多弄好了,心里高兴一下啊。第二天去到公司,拿4.0平台一试,果真不行。之前也是想好用第二种方法的,但是出现一个小问题就是还没有按下HOME键,logcat日志里就用了按下HOME一样的内容,导致结果不是真正想要的。为了偷懒就用了第一种方法了。谁知道无功而返,后来应老板的要求又要改,改回了第二种方法,但是那个问题依然存在啊,怎么办呢??于是我仔细想了一下,会不会是在Activity跳转的时候导致的呢。我发现了代码中 new Intent(getApplication(),**.class); 我就把 getApplication()变成当前的Activity ,问题成功击破,心里那个乐啊。

你可能感兴趣的:(Android--捕获HOME建)