我似乎有一个经典的任务,但我找不到任何关于如何做的例子。
我想下载一些东西。好吧,我打电话给网络服务并得到回复...但它几乎是一样的。
为了做到这一点,我有一个活动,它启动一个服务,产生一个完成工作的线程。
现在我想使用我在启动该服务的活动中获得的数据。
(我假设开始另一个活动来处理显示结果的工作很简单)
我的问题是服务如何通知某个活动(启动它或另一个活动的活动)?
非常感谢任何关于示例的指示。
此致
答案 0 :(得分:50)
根据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);
}
答案 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
。详细信息和样本可以在这篇文章中找到:
希望它有所帮助。
答案 3 :(得分:1)
您可以使用待定意图,事件总线, Messenger 或广播意图从服务中获取数据to activity / fragment,然后对数据执行一些操作。
查看我的博客文章,其中包含以下所有这些方法的链接 -
https://androidlearnersite.wordpress.com/2018/02/23/communicating-from-services/