服务如何将结果返回给活动
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 文档,如果您的 Activity
和 Service
在同一个应用程序中,则使用 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 Intent、Event Bus、Messenger 或 Broadcast Intents 从服务中获取数据到活动/片段,然后对数据执行一些操作。
My blog post 涵盖了所有这些方法。
【讨论】:
仅供参考,您的域已过期以上是关于服务如何将结果返回给活动的主要内容,如果未能解决你的问题,请参考以下文章
Android:setResult 未将结果返回给父 Activity