Android中的服务,Web和活动之间的来回通信

时间:2012-06-21 12:04:23

标签: android service broadcastreceiver intentservice

我阅读了大部分的问题和答案,我必须说我仍然不知道在哪种方式上,在我的情况下。有几种方法可以使用,但我无法确定哪种方法最适合我的情况。

我得到了什么

我有一个从我的应用程序启动的服务。它检查用户的当前位置,并使用读取位置调用Web服务。每隔x米就会发生这种情况。

我想获得什么

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

说完了,你建议我用什么?这会是一个好方法:Example: Communication between Activity and Service using Messaging

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

2 个答案:

答案 0 :(得分:3)

  

这意味着我的活动需要被告知每个阅读的位置。

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

注意:(Bellow我将在申请时向您展示示例)。

示例:

来自您的活动,请致电服务

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方法,在那里您可以做所需的事情。

答案 1 :(得分:0)

采用这种方法的另一种方法是使用Handler's response

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

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

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

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