如何从后台服务更新Android活动中的信息

rhi*_*nds 39 java android android-listview observer-pattern

我正在尝试创建一个具有ActivityList信息的简单Android应用程序,当应用程序启动时,我计划启动一个将不断计算数据的服务(它将会改变),我希望ActivityList与之同步服务计算应用程序生命周期的数据.

如何设置我的Activity以收听服务?这是解决此问题的最佳方法吗?

例如,如果您想象一个股票价格列表 - 数据将定期更改,并且需要与(在我的情况下)不断计算/获取数据的服务同步.

提前致谢

Com*_*are 94

如何设置我的Activity以收听服务?这是解决此问题的最佳方法吗?

你有三个主要选择,我认为:

  1. 轮询.将Activity定期询问Service最新数据.恕我直言,这个选项很糟糕,但它肯定是可能的.

  2. 回调.根据jax的回答,Activity注册一个回调对象("观察者")与Service.在Service上调用回调方法在数据改变时,这反过来又更新UI.你可以Service 在这里看到一个使用它的例子.

  3. 广播Intents.该Service播放器Intent通过sendBroadcast()对数据的变化.的Activity寄存器中BroadcastReceiver使用registerReceiver(),而且BroadcastReceiver被通知传入的广播.这会触发Activity加载来自的最新数据Service,或者可能只是为了从广播中的附加内容中获取最新数据Intent.您可以Service 在此处查看使用该技术的示例.

  • 这里排名第3的好例子...... http://www.websmithing.com/2011/02/01/how-to-update-the-ui-in-an-android-activity-using-data-from-a -background服务/ (11认同)
  • @resus:#2需要绑定,这会引入更多"状态"并使活动配置更改更具挑战性.正如所写的那样,#3真正广播到整个设备.在撰写本答案后的三年中,增加了其他选项.我建议你从Android支持包中考虑`LocalBroadcastManager`(比如#3,但是你的应用是私有的)或者使用Otto事件总线:http://square.github.io/otto/ (4认同)
  • @Ewoks LocalBroadcastManager更有效,因为意图只在内部发送,而不像旧方法那样全局发送.引自[BroadCastReceiver文档](http://developer.android.com/reference/android/content/BroadcastReceiver.html):"......这将为您提供更高效的实现(无需跨进程通信)" ... (3认同)
  • 技术2和3的优点和缺点是什么? (2认同)