【问题标题】:Comunication between Service, Web and Activity, back and forth, in AndroidAndroid 中 Service、Web 和 Activity 之间来回通信
【发布时间】:2012-06-21 12:04:22
【问题描述】:

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

我有什么

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

我想要得到的东西

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

话虽如此,您会推荐我使用什么?这是一个好方法吗:Example: Communication between Activity and Service using Messaging

LE:我已从 IntentService 切换到简单的 Service + 线程,用于将数据发送到 Web 服务。我的 IntentService 实现启动并迅速销毁。可能是我做错了什么......

【问题讨论】:

  • 在Service中接收到新数据时,如何使用接口将数据从Service发送到Activity?

标签: android service broadcastreceiver intentservice


【解决方案1】:

这意味着每次读取位置时都需要通知我的 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(当你需要时)方法将在你的ResultReceiver 中调用onReceiveResult,你可以在其中做你需要的事情。

【讨论】:

  • 我已经从 IntentService 切换到了简单的 Service。也许我的实现做错了,但我的 IntentService 启动并很快被破坏。所以我切换到服务+线程,现在它可以工作了。谢谢你的回答。
  • 工作得很好 ;) 非常感谢。
【解决方案2】:

另一种解决方法是按照response 使用处理程序。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 2012-05-17
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多