一个服务如何向活动返回结果

33

我似乎有一个经典的任务,但我找不到任何如何完成它的示例。

我想要下载一些东西。嗯,我调用了一个 Web 服务并获得了响应... 但基本上都是一样的。

为了做到这一点,我有一个活动启动了一个服务,该服务生成一个线程来完成工作。

现在,我想在启动该服务的活动中使用所得到的数据。

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

我的问题是,服务如何通知活动(启动它或其他活动)某些事情?

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

问候


您可以使用本地广播接收器进行检查,这里有一个简单的本地广播示例,请参见http://wiki.workassis.com/android-local-broadcast-receiver/。 - Bikesh M
4个回答

62
根据 Google 文档,如果您的 ActivityService 在同一个应用程序中,则使用 LocalBroadcastManager 要优于 sendBroadcast(intent),因为发送的信息不会经过系统,从而消除了被拦截的风险。
它非常容易使用。
在您的活动中,创建一个 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);
}

这比被接受的答案更有帮助,因为它提供了可行的代码。 - Ben Schmidt
我如何在使用这个实现时首先从活动中传递意图到我的服务?@JDenais - Itay Braha
1
@ItayBraha LocalBroadcastManager接收到的Intent是由Service创建的。Activity使用经典的startService(Intent)方法启动服务并传递Intent。 - JDenais
LocalBroadcast现在已经被弃用了:https://developer.android.com/reference/androidx/localbroadcastmanager/content/LocalBroadcastManager - juztcode

9

4
如果需要返回各种类型的数据,例如用户定义类,您可以尝试使用bindService和回调。这可以避免实现可包裹接口而不是sendBroadcast
请参阅我文章中的示例: https://stackoverflow.com/a/22549709/2782538 另外,如果您使用IntentService,则可以查看ResultReceiver。详细信息和示例可在此文章中找到: Android:restful API service 希望能有所帮助。

bindService()概念的很好的示例,正确地实现了该概念。 - Eido95

3
您可以使用待处理意图(Pending Intent)事件总线(Event Bus)信使(Messenger)广播意图(Broadcast Intents)从服务中获取数据,然后在活动/片段上执行一些操作。

我的博客文章涵盖了所有这些方法。


你的域名已过期,请知悉。 - user812786

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接