我阅读了大部分的问题和答案,我必须说我仍然不知道在哪种方式上,在我的情况下。有几种方法可以使用,但我无法确定哪种方法最适合我的情况。
我得到了什么
我有一个从我的应用程序启动的服务。它检查用户的当前位置,并使用读取位置调用Web服务。每隔x米就会发生这种情况。
我想获得什么
说完了,你建议我用什么?这会是一个好方法:Example: Communication between Activity and Service using Messaging?
LE:我已经从IntentService切换到简单的Service +线程,用于将数据发送到Web服务。我的IntentService实现已经开始并快速销毁。可能我做错了......
答案 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是否存在,那么也可以使用此模式,因为代理处理程序检查是否存在真正的回调,如果没有,则消息就这么简单了。