我阅读了有关 SO 的大部分问题和答案,但我必须说,就我而言,我仍然不知道该走哪条路。有多种方法可供选择,但我无法真正决定哪一种最适合我的情况。
我有什么
我有一个从我的应用程序启动的服务。它检查用户的当前位置,并使用读取的位置调用 Web 服务。每 x 米发生一次。
我想得到什么
- 使用 map 进行 Activity 并显示服务的当前位置读数。这意味着我的 Activity 需要在每次读取位置时得到通知。请记住,这只会在用户开始 Activity 时使用,因此我认为从服务广播每个位置不是一个好主意。
- 我可以向服务询问上次读取位置的 Activity 。
- 正如我之前提到的,该服务读取位置并需要每隔几秒将其发送到网络服务器。最好的方法是什么?在服务中为每个网络服务调用创建一个新的 Thread() ?使用异步任务?有时我可能会收到一些额外的值作为响应,在这种情况下我需要从网络服务启动一个 Activity 。
话虽如此,您会推荐我使用什么?这是一个好方法吗:Example: Communication between Activity and Service using Messaging ?
LE:我已经从 IntentService 切换到简单的服务 + 线程,用于将数据发送到 Web 服务。我的 IntentService 实现启动并迅速销毁。可能我做错了什么....
最佳答案
This means my Activity needs to be informed on each location read.
我认为实现您的目标的一个干净高效的解决方案是使用 ResultReceiver .
注意:(下面我将向您展示我的应用程序中的示例)。
示例:
来自您调用的服务的 Activity 。
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的 fragment
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
,您可以在其中执行您需要的操作。
关于android - Android 中 Service、Web 和 Activity 之间的来回通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11137754/