不断地从 Started Service 向 Activity 发送值
Posted
技术标签:
【中文标题】不断地从 Started Service 向 Activity 发送值【英文标题】:Continuously send values from Started Service to Activity 【发布时间】:2018-11-18 07:55:14 【问题描述】:我有一个名为 LocationService 的已启动服务,它每 3 秒检索一次设备的位置。我希望这些值显示在应用程序的 UI 上。为此,我需要将值传递回主活动。
与 Activity 的通信需要持续并能够长期运行。
这样做的最佳方法是什么?我研究了绑定服务和本地广播,但不确定哪个最适用于与 UI 的持续通信。
【问题讨论】:
可以在activity中使用Handler来传递数据。 这个问题太宽泛了,有很多方法可以做到这一点,没有一种方法最适合每个人。 LiveData、Broadcasts 和 RxJava 总的来说都是很好的解决方案。 @Sander 有很多方法可以做到这一点,这就是我问这个问题的原因,因为我对什么是最好的解决方案感到困惑。我很高兴让我的问题更具体 没有单一的最佳方法,这实际上取决于您的需求和应用程序的结构。例如。我在存储库中获取位置更新,该存储库通过 LiveData 将位置更新发送到 ViewModel,ViewModel 将这个 LiveData 暴露给 Fragment,但如果您没有在应用程序中使用 MVVM 架构,那将没有意义。 【参考方案1】:经过大量研究和修改后,我发现使用 LocalBroadcastManager 适合持续更新另一个 Activity。实施也很简单。
在 Service 类中,当值更新时,将运行方法 updateUI()
:
private void updateUI(String statusValue)
broadcastIntent.putExtra("status", statusValue);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
这会广播主活动要拾取的值
在 Main Activity 中,我添加了一个 BroadcastReceiver 来接收这些频繁的更新:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
// Get extra data included in the Intent
String brStatus = intent.getStringExtra("status");
if(brStatus != null)
//Do something
;
我会注意到 LocalBroadcastManager 只能在活动运行时提供持续更新。当onPause()
被点击时,更新的接收者被取消注册。
【讨论】:
以上是关于不断地从 Started Service 向 Activity 发送值的主要内容,如果未能解决你的问题,请参考以下文章
问题汇总记录----mysql不能启动,提示service could not be started
STFService.apk在手机上提示 Not found ; no service started