【问题标题】:Continuously send values from Started Service to Activity不断地从 Started Service 向 Activity 发送值
【发布时间】:2018-11-18 07:55:14
【问题描述】:

我有一个名为 LocationService 的已启动服务,它每 3 秒检索一次设备的位置。我希望这些值显示在应用程序的 UI 上。为此,我需要将值传递回主活动。

与 Activity 的通信需要持续并能够长期运行。

这样做的最佳方法是什么?我研究了绑定服务和本地广播,但不确定哪个最适用于与 UI 的持续通信。

【问题讨论】:

  • 可以在activity中使用Handler来传递数据。
  • 这个问题太宽泛了,有很多方法可以做到这一点,没有一种方法最适合每个人。 LiveData、Broadcasts 和 RxJava 总的来说都是很好的解决方案。
  • @Sander 有很多方法可以做到这一点,这就是我问这个问题的原因,因为我对什么是最好的解决方案感到困惑。我很高兴让我的问题更具体
  • 没有单一的最佳方法,这实际上取决于您的需求和应用程序的结构。例如。我在存储库中获取位置更新,该存储库通过 LiveData 将位置更新发送到 ViewModel,ViewModel 将这个 LiveData 暴露给 Fragment,但如果您没有在应用程序中使用 MVVM 架构,那将没有意义。

标签: android android-intent android-service android-location


【解决方案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() 被点击时,更新的接收者被取消注册。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多