【发布时间】:2011-02-24 22:37:45
【问题描述】:
我在 android 中有一个服务,它不断提取传感器信息并通过网络接口发送它们。
另一方面,我有几个活动将以不同的方式使用这些传感器值。由于服务以事件驱动的方式获取值,我如何才能将这些值仅传递给前台的活动?
提前致谢
【问题讨论】:
标签: android design-patterns service android-activity
我在 android 中有一个服务,它不断提取传感器信息并通过网络接口发送它们。
另一方面,我有几个活动将以不同的方式使用这些传感器值。由于服务以事件驱动的方式获取值,我如何才能将这些值仅传递给前台的活动?
提前致谢
【问题讨论】:
标签: android design-patterns service android-activity
我认为这是“本地”服务的最常见情况,即与活动在同一进程中运行。
有两种解决方案,一种是服务向在onStart() 和onStop() 中注册和注销正确的BroadcastReceiver 的活动发送意图。
另一个使用侦听器机制。您可以按照here 的说明获取对服务实例的引用。在服务中写入setListener(ServiceListener l) 方法
和一个ServiceListener 接口,您将能够在您的活动中实现一个侦听器并将其设置在服务上。
intent 方式可能更简单,风险更小,但您必须坚持使用intent extra 进行数据交换。
监听器的方式更灵活,但我读过必须确保取消注册监听器,否则你可能最终会成为 mem.泄露整个活动。
【讨论】:
根据我的经验,我发现最好让我的活动使用绑定到服务
bindService(new Intent( this, ClassroomService.class), mConnection, Context.BIND_AUTO_CREATE );
一旦服务被绑定,我会从我的活动发送一条消息到在活动服务连接 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() 上取消绑定,则活动将仅在其处于前台时接收消息。
希望对您有所帮助。
【讨论】: