2017-03-01 32 views
1

是否知道是否有任何方法从MainActivity启动服务,发送一些数据以及服务完成时,从服务中获取数据。例如:Android从MainActivity的服务中获取数据

//MainActivity.class 

private ArrayList myList = new ArrayList(); 

public void fetchDataFromInternet() 
{ 
    Intent intent = new Intent(this, DataFromInternetService.class); 
    intent.putArrayListExtra("MYLIST", myList); 
    startService(intent); 

    //In DataFromInternetService the app fetches data from the internet and puts them in the myList. 
    /* 
     TODO: 
     1. Get the data from the service after the it has finished. 
    */ 
} 
//Note: The service runs only 1 time. 

而且,如果这是不可能的,你有什么建议可供选择,其中MainActivity访问从DataFromInternetService.class数据。

注意:我不想使用LoaderManager,我使用Services来执行不影响UI的后台任务。

+1

您可以使用本地广播接收器。 –

+0

是的,但服务完成后我将如何获得新的“myList”? – user6115152

+0

您在完成服务时意味着什么?那么你可以通过广播接收机的意图发送列表。 –

回答

0

而不是使用一个服务运行在后台的东西,你应该使用Async Tasks

,你可以做到以下几点:

new AsyncTask<Void,Void,Void>(){ 

doInBackground(){ 

//DO STUFF 

} 

onPostExecute(){ 
//Do What You want with the results 
} 
} 

} 
+0

当然,如果用户从应用程序导航离开应用程序,我也可以使用LoaderManager和AsyncTask来防止任何“僵尸”任务,但是我的导师告诉我仅使用LoaderManager如果必须更新UI稍后的。如果后台任务不影响用户界面,我应该使用服务 – user6115152

0

如果你想与您的服务进行通信,你必须使用绑定的服务并在您的活动中与其绑定。然后为您的活动和服务创建处理程序。使用这些处理程序,您可以在下载完成后通知您的活动。 请让我知道你是否设法解决你的问题或需要一些进一步的指示。

0

这就是几年前任何讨论已经完成的问题,但每次我们需要为我们的应用程序选择最舒适的方法时仍然困扰着我们。我不应该深入代码示例或低级解释。你可以自己找到超过需要的信息。
我可以帮助的一件事(我希望如此)是分享我的方法。 当我面临像how to pass data between two different components?这样的问题时 - 我认为这种情况很直接。你需要通知你的饥饿的组件(在我们的具体情况下的活动)取得完成,它可以从一个值得信任的地方得到他的信息。或者更残酷的是,将数据直接传递给它。这可以通过不同的实现/解决方案来实现,但抽象思想仍然保持不变。
你能做什么?这里有一些链接:

而且还有更多有价值的解决方案,但这些都足够了。