服务如何将结果返回给活动

Posted

技术标签:

【中文标题】服务如何将结果返回给活动【英文标题】:how does a service return result to an activity 【发布时间】:2011-04-19 22:55:27 【问题描述】:

我似乎有一个经典任务,但我找不到任何关于如何执行它的示例。

我想下载一些东西。好吧,我调用了一个网络服务并得到了响应......但它几乎是一样的。

为了做到这一点,我有一个活动来启动一个服务,该服务会产生一个执行该工作的线程。

现在我想使用我在启动服务的活动中获得的数据。

(我假设启动另一个活动来处理显示结果的工作很简单)

我的问题是服务如何通知活动(启动它的活动或另一个活动)?

非常感谢任何指向示例的指针。

问候

【问题讨论】:

你可以使用本地广播接收器来查看这个简单的本地广播示例wiki.workassis.com/android-local-broadcast-receiver 【参考方案1】:

通过 sendBroadcast() 发送带有数据的广播 Intent,Activity 通过 BroadcastReceiver 接收该数据。

这是一个例子:https://github.com/commonsguy/cw-android/tree/master/Service/WeatherAPI 文件: http://developer.android.com/reference/android/content/BroadcastReceiver.html

【讨论】:

【参考方案2】:

根据 Google 文档,如果您的 ActivityService 在同一个应用程序中,则使用 LocalBroadcastManager 比使用 sendBroadcast(意图)更可取,因为发送的信息不会通过系统,从而消除了以下风险拦截。

它很容易使用。

在您的活动中,创建一个BroadcastReceiver 并在 onResume() 方法中动态添加一个侦听器:

private BroadcastReceiver  bReceiver = new BroadcastReceiver()

    @Override
    public void onReceive(Context context, Intent intent) 
        //put here whaterver you want your activity to do with the intent received
               
;

protected void onResume()
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message"));


protected void onPause ()
    super.onPause();
 LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver);

在您的服务中,您会获得一个 LocalBroadcastManager 实例并使用它来发送意图。我通常把它放在它自己的方法中:

private void sendBroadcast (boolean success)
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver
    intent.putExtra("success", success);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

【讨论】:

就可行的代码而言,这比公认的答案更有帮助 如何首先使用此实现将意图从活动传递给我的服务? @JDenais @ItayBraha 传递给 LocalBroadcastManager 的 Intent 是由服务创建的。 Activity 使用经典的startService(Intent) Activity 方法启动带有 Intent 的服务。【参考方案3】:

如果需要返回各种类型的数据,比如自定义类,可以试试bindService和回调。这样可以避免实现parcelable接口而不是sendBroadcast

请看我帖子中的例子:

https://***.com/a/22549709/2782538

此外,如果您使用IntentService,您可以查看ResultReceiver。详细信息和示例可以在这篇文章中找到:

Android: restful API service

希望对你有帮助。

【讨论】:

bindService() 概念的好例子,正确实现了这个概念。【参考方案4】:

您可以使用 Pending IntentEvent BusMessengerBroadcast Intents 从服务中获取数据到活动/片段,然后对数据执行一些操作。

My blog post 涵盖了所有这些方法。

【讨论】:

仅供参考,您的域已过期

以上是关于服务如何将结果返回给活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何使活动返回结果给调用它的活动?

Android:setResult 未将结果返回给父 Activity

启动对话框以获取结果以将值返回给主要活动

如何从适配器 startActivityForResult 以将结果返回给 Fragment

如何设计一个包含 Web 服务结果的类

如何使用接口将活动回调返回到片段