【问题标题】:pass information from a service the foreground activity从服务传递信息到前台活动
【发布时间】:2011-02-24 22:37:45
【问题描述】:

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

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

提前致谢

【问题讨论】:

    标签: android design-patterns service android-activity


    【解决方案1】:

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

    有两种解决方案,一种是服务向在onStart()onStop() 中注册和注销正确的BroadcastReceiver 的活动发送意图。

    另一个使用侦听器机制。您可以按照here 的说明获取对服务实例的引用。在服务中写入setListener(ServiceListener l) 方法 和一个ServiceListener 接口,您将能够在您的活动中实现一个侦听器并将其设置在服务上。

    intent 方式可能更简单,风险更小,但您必须坚持使用intent extra 进行数据交换。

    监听器的方式更灵活,但我读过必须确保取消注册监听器,否则你可能最终会成为 mem.泄露整个活动。

    【讨论】:

      【解决方案2】:

      根据我的经验,我发现最好让我的活动使用绑定到服务

      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() 上取消绑定,则活动将仅在其处于前台时接收消息。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多