Android 从 MainActivity 中的服务获取数据

Android get data from a Service in MainActivity

您知道是否有任何方法可以从 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,我使用服务来执行不影响 UI 的后台任务。

您应该使用 Async Tasks

而不是在后台使用 运行 东西的服务

您可以执行以下操作:

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

doInBackground(){

//DO STUFF

}

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

}

如果您想与您的服务通信,您必须使用绑定服务并在您的 activity 中绑定到它。然后为您的 activity 和您的服务创建处理程序。使用这些处理程序,您可以在下载完成后通知您的 activity。 如果您设法解决了问题或需要进一步说明,请告诉我。

关于这一点的任何讨论在几年前就已结束,但每次我们需要为我们的应用程序选择最舒适的方法时,仍然困扰着我们。我不认为我应该深入研究代码示例或低级解释。您可以自己找到更多所需的信息。
我可以提供帮助的一件事(我希望如此)是分享我的方法。 当我遇到像 how to pass data between two different components? 这样的问题时 - 我会直截了当地对待这种情况。您需要通知您的 hungry 组件(在我们的特定情况下为 activity),它正在获取已完成,它可以从可信赖的地方获取他的信息。或者更残忍一点,直接把数据传给它。这可以通过不同的 implementations/solutions 来实现,但抽象的意识形态保持不变。
你能做什么?这里有一些链接:

还有更有价值的解决方案,但这些就足够了。

要与您的服务通信,您可以使用绑定服务:

请检查: https://developer.android.com/guide/components/bound-services.html

或者您可以在以下位置发送您的数据:广播接收器、数据库、共享首选项。这取决于您的需求。