不断地从 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

数据不会不断地从自定义 wordpress 表中加载

STFService.apk在手机上提示 Not found ; no service started

STFService.apk在手机上提示 Not found ; no service started

Android总结 - Service

Android Service的分类详解