有种方法可能会行,但有局限性,就是要以startService方式启动,并且不知道还会不会产生其它影响。说下原理,设置一个全局标志,在activity中获取到按键监听,设置不同标志,然后启动service。由于service已经启动了,所以只会调用onStartCommand方法,在其中判断全局标志执行相应操作

解决方案 »

  1.   


    这样做肯定不行,因为我的应用就没有activity,全部都是后台service,所以对按键的检测只能从service上相办法。
    你说的这种方法:如果activity被挂到了后台,同样按键还是没法检测到、
      

  2.   

    activity中发广播,
    service去接受。如果你说的是系统级的按键监听,安卓由于权限设置,貌似很难做到。
      

  3.   

    哎呀,还是那个问题,我的程序没有activity,所以还是没法接收按键。
    而且即使是有activity,当程序被挂起放到后台之后还是无法接收按键了。。
    你的意思是如果按键是系统级的,就可以被监听到么???还有啊,普通手机上的关机键是怎么做到的呢,他应该也是一个service啊,是怎么捕获到的呢???
      

  4.   

    解决了告诉我我也正找这个问题呢好像系统只能监听home 键。对菜单键;和返回键,都监听不到。有个搜索键的监听但是我试了不管用。。activity挂后台了肯定监听不到了。那个监听只能在顶层界面。。
      

  5.   


    你说的监听home键,可以在service中么????如何做到的,代码贴一下吧,应该是同样的道理。。
    我觉得肯定还是有办法的,要不然关机键,音量键是如何实现的呢
      

  6.   

    貌似这个问题还有点难度,lz解决了告诉我一下,灰常感谢,我邮箱[email protected]
      

  7.   


    二、app中对于HOME键广播事件的接收      首先,自定义一个BroadcastReceiver:[java] view plaincopy
    class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {  
      
        static final String SYSTEM_REASON = "reason";  
        static final String SYSTEM_HOME_KEY = "homekey";//home key  
        static final String SYSTEM_RECENT_APPS = "recentapps";//long home key  
          
        @Override  
        public void onReceive(Context context, Intent intent) {  
            String action = intent.getAction();  
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {  
                String reason = intent.getStringExtra(SYSTEM_REASON);  
                if (reason != null) {  
                    if (reason.equals(SYSTEM_HOME_KEY)) {  
                        // home key处理点  
                          
                    } else if (reason.equals(SYSTEM_RECENT_APPS)) {  
                        // long home key处理点  
                    }  
                }  
            }  
        }  
    }  
           其次,生成且注册之
    [java] view plaincopy
    receiver = new HomeKeyEventBroadCastReceiver();  
    registerReceiver(receiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));  
    这样,我们就可以在app中进行HOME键的处理了!没有试过。估计是这个思路。
      

  8.   


    大哥啊,你的onkey事件还是只有在当前窗口获得焦点之后,才会检测到按键事件,,哎,,,
      

  9.   

    奥,其实home键触发时会发出一个广播啊。这样的话,我们可以参照home键的实现修改底层,把自己想要检测的按键也做成一个广播唠,
      

  10.   


    大哥啊,你的onkey事件还是只有在当前窗口获得焦点之后,才会检测到按键事件,,哎,,,
    public class NotifyService extends Service implements OnKeyListener {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    return false;
    }
    }
    这样得不?平时用的控件onkey什么的也是没有,感觉都是添加上去的。。上班没时间测试下代码,只能想想,楼主试试。。
      

  11.   


    大哥啊,你的onkey事件还是只有在当前窗口获得焦点之后,才会检测到按键事件,,哎,,,
    public class NotifyService extends Service implements OnKeyListener {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    return false;
    }
    }
    这样得不?平时用的控件onkey什么的也是没有,感觉都是添加上去的。。上班没时间测试下代码,只能想想,楼主试试。。如果按照这种方式写,此方法始终没有被调用。不知道是我写的不对的,还是这个函数的问题。。
    而且就算是可以被执行,当此界面失去焦点之后,还是失效了,不会响应
      

  12.   

    为什么都是这种方式调用onkey方法,,
    所以这样还是不能达到预期效果,在service中获取按键edit2.setOnKeyListener(new OnKeyListener() {
      public boolean onKey(View v, int keyCode, KeyEvent event) {
      
    return true;
      }
      });
      

  13.   

    怎么还onkeydwon啊,,没有activity啊。。看清楚哦。 求菜单键和返回键的全局监听。。
      

  14.   


    http://blog.chinaunix.net/uid-26620446-id-3205382.html
    这里有个链接,大概是讲home键发广播的实现原理,可以参照这个改。当然了,,我也不会哈
      

  15.   

    你这个不该framework层能实现吗?楼主,在framework有对物理按键的响应,关于自己写的apk来对返回键和home键进行监听这个我不清楚,如果你知道,请告诉我下,好吗?
      

  16.   


    这个需求必须修改底层才可实现,我现在的做法是修改底层,在按键按下时发送广播,这样在service或者activity都可捕获到按键信息
      

  17.   

    PhoneWindowManager.java中去改,包括监听音量,开关机等全局键都在这里修改
      

  18.   

    服务中 可以 new个透明的View 放在window层   在View中用 dispatchKeyEvent(KeyEvent event) 监听  因为window层对按键事件的分发“没处理”