我要实现一个监控服务的功能,希望能够监控USB Wifi的状态,并通知另一个应用程序。
1.  建立一个BroadcastReceiver监控 USB  WIFI的状态
2.  建立一个Service,并开机启动。
3.  如何在BroadcastReceiver的onReceive方法中,获取Service的对象,并且调用Service中的方法通知另一个应用程序呢?我希望能够在Service有一个Handler句柄, BroadcastReceiver的onReceive捕获状态变化事件以后可以通过发送消息交给Handler处理,问题在于不知道如何获取到Handler句柄?!ServiceBroadcastReceiver Handler

解决方案 »

  1.   

    这个句柄设成静态变量
    或者最简单的弄一个单例的公共类,里面有setHandler和getHandler
      

  2.   


    这2个方法我也想过,设置成static方便是方便,但是感觉太暴露了一点。。
      

  3.   

    利用aidl,里面定义一个方法,再service里面实现这个方法就可以了
      

  4.   

    很简单啊   既然开机启动   那你的receiver不设计成全局接收器呗  
    弄成动态注册的     然后创建时  将service的handler传进去    onReceive 根据收到的不同的广播 传递不同的值给service处理
    关于你的第三点   调用Service中的方法通知另一个应用程序呢?  想提出不同意见你直接传递不同的CMD给service  利用startService(Intent包含信息)  让service自己去处理事件
    注:startServices只是调用onStartCommand  而不是重新创建service
     
      

  5.   


    补充下,注:startServices只是调用onStartCommand  而不是重新创建service   这句话
    service已经启动了不会创建  没启动会创建并启动service
      

  6.   


    补充下,注:startServices只是调用onStartCommand  而不是重新创建service   这句话
    service已经启动了不会创建  没启动会创建并启动service首先谢谢你的回答!
    其次,说说里面可能存在的问题。
    第一,  handler属于不能序列化的对象,所以不能通过Intent进行传递。第二, onStartCommand是否在service启动的时候才会调用,以后还能调用吗?我目前的解决办法是 receiver 作为service的内部类,handler是service的成员变量。
    如此一来,在onReceive方法中可以直接使用handler进行操作了。
      

  7.   


    使用aidl,主要在于bindService时使用吧?
    然而官方文档似乎有说明, 在receiver中不可采用bindService的方式。
      

  8.   


    补充下,注:startServices只是调用onStartCommand  而不是重新创建service   这句话
    service已经启动了不会创建  没启动会创建并启动service首先谢谢你的回答!
    其次,说说里面可能存在的问题。
    第一,  handler属于不能序列化的对象,所以不能通过Intent进行传递。第二, onStartCommand是否在service启动的时候才会调用,以后还能调用吗?我目前的解决办法是 receiver 作为service的内部类,handler是service的成员变量。
    如此一来,在onReceive方法中可以直接使用handler进行操作了。

    你2个问题都搞错了
    1,handler不是用intent传,而是直接传递引用  让receiver获取引用 然后用这个handler给你service的handler发消息(其实是自己给自己发  但是是通过receiver来发)
    这个和你将receiver设置成内部类差不多  效果一样
    2.onStartCommand是每次调用startService都会调用的   并且不会影响 
    所有可以放心的传递一个值(CMD,表示不同的操作),这个值就像我上面说的   可以用startService
    或者使用handler
      

  9.   


    使用aidl,主要在于bindService时使用吧?
    然而官方文档似乎有说明, 在receiver中不可采用bindService的方式。
    在receiver中直接用startServices方法就可以。
      

  10.   

    既然Service开机就启动,最简单的方法就是在service中注册一个BroadcastReveiver来监听USB、WIFI事件,这样就可以在onReceive中方便的操作handler了。
    或者Service不想开机启动,可以在Manifest中注册BroadcastReceiver,收到USB、WIFI事件以后,在onReceive方法中启动Service,同时传递一个Intent,让Service知道当前是什么事件,以便通知另一个应用。
    但是感觉这样没必要啊,为什么不在最终的那个应用中直接监听USB、WIFI事件呢?