1

我阅读了大多数关于 SO 的问题和答案,我必须说,就我而言,我仍然不知道该走哪条路。有几种方法可以使用,但我无法确定哪一种最适合我的情况。

我有什么

我有一个从我的应用程序开始的服务。它检查用户的当前位置并使用读取的位置调用 Web 服务。这每 x 米发生一次。

我想得到什么

  • 使用地图进行活动并显示来自服务的当前位置读数。这意味着我的 Activity 需要在读取的每个位置上得到通知。请记住,这仅在用户启动活动时使用,因此我认为从服务广播每个位置不是一个好主意。
  • 我可以向服务询问其上次读取位置的活动。
  • 正如我之前提到的,该服务读取位置并需要每隔几秒钟将其发送到 Web 服务器。最好的方法是什么?在服务中为每个 Web 服务调用创建一个新的 Thread() ?使用异步任务?有时我可能会收到一些额外的值作为响应,在这种情况下我需要从 web 服务启动一个活动。

说了这么多,你会推荐我用什么?这会是一个好方法吗:示例:使用消息传递在 Activity 和 Service 之间进行通信

LE:我已经从 IntentService 切换到简单的 Service + 线程来向 Web 服务发送数据。我的 IntentService 实现启动并迅速销毁。大概是我做错了什么......

4

2 回答 2

3

这意味着我的 Activity 需要在读取的每个位置上得到通知。

我认为为您的目标提供一个干净有效的解决方案是使用ResultReceiver

注意:(下面我将向您展示我的应用程序中的示例)。

例子:

来自您调用Service的活动。

Intent i = new Intent(this, DownloadService.class);
i.putExtra("url", "http://dl.dropbox.com/u/67617541/2011-11-11_102220_nature.jpg");
i.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(i);

已实现的 ResultReceiver

private class DownloadReceiver extends ResultReceiver {

        public DownloadReceiver(Handler handler) {
            super(handler);
        }

        @Override
        public void onReceiveResult(int resultCode, Bundle resultData) {
           super.onReceiveResult(resultCode, resultData);
           if (resultCode == DownloadService.PROGRESS_UPDATE) {
              int progress = resultData.getInt("progress");
              pd.setProgress(progress);
           }
       }
}

IntentService的片段

protected void onHandleIntent(Intent intent) {  
   String urlLink = intent.getStringExtra("url");
   ResultReceiver receiver = intent.getParcelableExtra("receiver");
   // some body
   Bundle data = new Bundle();
   //publishing progress
   receiver.send(PROGRESS_UPDATE, data);
}

因此,只需调用send(当你需要时)方法就会在你可以做你需要的地方被onReceiveResult调用ResultReceiver

于 2012-06-21T12:22:29.480 回答
0

对此采取的另一种方法是根据此响应使用处理程序。

列出的文章讨论了如何将数据从服务传递到启动它的 UI 之外的 UI ......虽然这不是您的问题/问题,但您仍然可以使用相同的模式。

基本上,您的 Activity 在启动时会将自己注册为处理程序回调并启动位置服务。位置服务会将消息发布到处理程序回调,并由您的活动处理。

在活动终止时,您停止服务,然后将自己作为处理程序回调删除。

如果服务一直在运行,但不知道 UI 是否存在,那么也可以使用此模式,因为代理处理程序会检查是否存在真正的回调,如果没有,则消息只是简单的掉了。

于 2012-06-21T12:34:07.620 回答