android - Android 中 Service、Web 和 Activity 之间的来回通信

标签 android service broadcastreceiver intentservice

我阅读了有关 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/

相关文章:

java - 如何在Android Studio上修复Gradle错误

android - Android 应用程序中的 Directions API 实时跟踪

c# - 如何向 C# 库添加服务引用?

19+ api 中用于 SMS 的 Android 静态广播接收器(当应用程序关闭时)

android - 广播接收器推送通知

android - 如何将 FileDescriptor 与 HTTP URL 一起使用

java web服务使用post方法获取参数

android - 如何停止服务中的功能?

android - "com.android.vending.INSTALL_REFERRER"不知何故参数丢失并更改为 (not%20set)

java - Cordova Phonegap 2.2.0 视频播放器插件