我在android中有一项服务,它不断地提取传感器信息并通过网络接口发送它们。
另一方面,我有几个活动会以不同的方式使用这些传感器值。由于服务以事件驱动的方式获取值,因此如何将这些值仅传递给前台中的活动?
提前致谢
答案 0 :(得分:3)
我认为这是“本地”服务最常见的情况,即在与活动相同的过程中运行。
有两种解决方案,一种是服务向注册和取消注册BroadcastReceiver
和onStart()
中正确的onStop()
的活动发送意图。
另一个使用侦听器机制。您可以按照here的说明获取对服务实例的引用。在服务中编写setListener(ServiceListener l)
方法
和ServiceListener
接口,您将能够在您的活动中实现一个监听器并将其设置在服务上。
意图方式可能更简单,风险更小,但你必须坚持使用意图额外的数据交换。
监听器的方式更灵活,但我已经读过必须确保取消注册监听器,否则你可能会结束mem。泄漏整个活动。
答案 1 :(得分:1)
根据我的经验,我发现最好让我的活动使用
绑定到服务bindService(new Intent( this, ClassroomService.class), mConnection, Context.BIND_AUTO_CREATE );
一旦绑定了服务,我就会从我的活动向服务发送一条消息,在服务ServiceConnection onServiceConnected()中注册活动消息处理程序。
public void onServiceConnected( ComponentName className, IBinder service )
{
MyService mService = new Messenger(service);
Message msg = Message.obtain(null, MyService.MSG_REGISTER_CLIENT );
msg.replyTo = mMessenger;
mService.send(msg);
}
在服务方面,当收到此消息时,我存储了replyTo成员中传递的处理程序,并使用该处理程序将消息发送回“已注册”活动。如果当前未注册任何活动,则忽略该消息。
当从服务解除绑定时,我还发送一个MyService.MSG_UNREGISTER_CLIENT来告诉服务清除存储的处理程序引用。
如果绑定到活动onResume()中的服务并取消绑定onPause(),则活动将仅在前景中接收消息。
希望有所帮助。