【问题标题】:Android get data from a Service in MainActivityAndroid 从 MainActivity 中的 Service 获取数据
【发布时间】:2017-03-01 20:45:05
【问题描述】:

你知道是否有任何方法可以从 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 的后台任务。

【问题讨论】:

  • 你可以使用本地广播接收器。
  • 是的,但是服务完成后我将如何获得新的“myList”?
  • 完成服务是什么意思?好吧,您可以通过广播接收器的意图发送列表。
  • 服务在后台运行,直到完成所有数据的获取...我可以使用广播接收器...但是我想在 MainActivity 中返回“myList”,特别是在 fetchDataFromInternet()方法,以便我以后可以将其分配给 myList

标签: android android-intent android-service


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    您可以执行以下操作:

    new AsyncTask<Void,Void,Void>(){
    
    doInBackground(){
    
    //DO STUFF
    
    }
    
    onPostExecute(){
    //Do What You want with the results
    }
    }
    
    }
    

    【讨论】:

    • 当然,如果用户离开应用程序,我也可以使用带有 AsyncTask 的 LoaderManager 来防止任何“僵尸”任务,但是我的导师告诉我只有在必须更新时才使用 LoaderManager稍后UI。如果后台任务不影响 UI,我应该使用服务
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-24
        • 1970-01-01
        • 2023-04-03
        • 2020-02-09
        相关资源
        最近更新 更多