从服务传递信息前景活动

时间:2011-02-24 22:37:45

标签: android design-patterns service android-activity

我在android中有一项服务,它不断地提取传感器信息并通过网络接口发送它们。

另一方面,我有几个活动会以不同的方式使用这些传感器值。由于服务以事件驱动的方式获取值,因此如何将这些值仅传递给前台中的活动?

提前致谢

2 个答案:

答案 0 :(得分:3)

我认为这是“本地”服务最常见的情况,即在与活动相同的过程中运行。

有两种解决方案,一种是服务向注册和取消注册BroadcastReceiveronStart()中正确的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(),则活动将仅在前景中接收消息。

希望有所帮助。