我要实现一个监控服务的功能,希望能够监控USB Wifi的状态,并通知另一个应用程序。
1. 建立一个BroadcastReceiver监控 USB WIFI的状态
2. 建立一个Service,并开机启动。
3. 如何在BroadcastReceiver的onReceive方法中,获取Service的对象,并且调用Service中的方法通知另一个应用程序呢?我希望能够在Service有一个Handler句柄, BroadcastReceiver的onReceive捕获状态变化事件以后可以通过发送消息交给Handler处理,问题在于不知道如何获取到Handler句柄?!ServiceBroadcastReceiver Handler
1. 建立一个BroadcastReceiver监控 USB WIFI的状态
2. 建立一个Service,并开机启动。
3. 如何在BroadcastReceiver的onReceive方法中,获取Service的对象,并且调用Service中的方法通知另一个应用程序呢?我希望能够在Service有一个Handler句柄, BroadcastReceiver的onReceive捕获状态变化事件以后可以通过发送消息交给Handler处理,问题在于不知道如何获取到Handler句柄?!ServiceBroadcastReceiver Handler
或者最简单的弄一个单例的公共类,里面有setHandler和getHandler
这2个方法我也想过,设置成static方便是方便,但是感觉太暴露了一点。。
弄成动态注册的 然后创建时 将service的handler传进去 onReceive 根据收到的不同的广播 传递不同的值给service处理
关于你的第三点 调用Service中的方法通知另一个应用程序呢? 想提出不同意见你直接传递不同的CMD给service 利用startService(Intent包含信息) 让service自己去处理事件
注:startServices只是调用onStartCommand 而不是重新创建service
补充下,注:startServices只是调用onStartCommand 而不是重新创建service 这句话
service已经启动了不会创建 没启动会创建并启动service
补充下,注:startServices只是调用onStartCommand 而不是重新创建service 这句话
service已经启动了不会创建 没启动会创建并启动service首先谢谢你的回答!
其次,说说里面可能存在的问题。
第一, handler属于不能序列化的对象,所以不能通过Intent进行传递。第二, onStartCommand是否在service启动的时候才会调用,以后还能调用吗?我目前的解决办法是 receiver 作为service的内部类,handler是service的成员变量。
如此一来,在onReceive方法中可以直接使用handler进行操作了。
使用aidl,主要在于bindService时使用吧?
然而官方文档似乎有说明, 在receiver中不可采用bindService的方式。
补充下,注: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
使用aidl,主要在于bindService时使用吧?
然而官方文档似乎有说明, 在receiver中不可采用bindService的方式。
在receiver中直接用startServices方法就可以。
或者Service不想开机启动,可以在Manifest中注册BroadcastReceiver,收到USB、WIFI事件以后,在onReceive方法中启动Service,同时传递一个Intent,让Service知道当前是什么事件,以便通知另一个应用。
但是感觉这样没必要啊,为什么不在最终的那个应用中直接监听USB、WIFI事件呢?