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

时间:2010-10-01 16:15:41

标签: android service android-activity notifications

我似乎有一个经典的任务,但我找不到任何关于如何做的例子。

我想下载一些东西。好吧,我打电话给网络服务并得到回复...但它几乎是一样的。

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

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

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

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

非常感谢任何关于示例的指示。

此致

4 个答案:

答案 0 :(得分:50)

根据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);
}

答案 1 :(得分:8)

通过sendBroadcast()发送广播对数据的意图,该活动通过BroadcastReceiver接收。

以下是一个示例:https://github.com/commonsguy/cw-android/tree/master/Service/WeatherAPI 文档: http://developer.android.com/reference/android/content/BroadcastReceiver.html

答案 2 :(得分:4)

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

请参阅我的帖子中的示例:

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

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

Android: restful API service

希望它有所帮助。

答案 3 :(得分:1)

您可以使用待定意图事件总线 Messenger 广播意图从服务中获取数据to activity / fragment,然后对数据执行一些操作。

查看我的博客文章,其中包含以下所有这些方法的链接 -

https://androidlearnersite.wordpress.com/2018/02/23/communicating-from-services/