【问题标题】:Uploading files in an Android service在 Android 服务中上传文件
【发布时间】:2013-06-24 04:02:46
【问题描述】:

让 Android 应用应用户请求将可能较大的文件上传到服务器的最佳方式是什么?

我目前正在使用IntentService,我在其中调用startForeground 并定期更新通知进度,但服务会在大约一分钟左右后被系统随机终止。

这是来自onHandleIntent的相关代码:

class BeamService extends IntentService("SSH Beam") {

  override def onHandleIntent(intent: Intent) = {

    ...

    // Start the notification
    startForeground(0,
      builder
      .setTicker("Starting transfer")
      .setContentTitle(filename)
      .setContentText("Starting transfer")
      .setOngoing(true).build
    )

    // Create the session and the monitor
    val session = server.createSession(auth)
    implicit val monitor = Monitor(filename, size)

    // Send the file
    try {
      session.connect
      session.cd(destination)
      session.put(filename, is)
    } catch {
      case e: Throwable => {
        notificationManager.notify(0,
          builder.setProgress(0, 0, false)
                 .setTicker("Transfer failed")
                 .setContentText(e.getMessage)
                 .build
        )
        e.printStackTrace
      }
    } finally {
      session.disconnect
      is.close
    }

    stopForeground(false)
  }
}

【问题讨论】:

  • 您可以考虑发布该服务的代码。另外,请记住 IntentService 有自己的后台线程(所以不要分叉你自己的),并且它不会让设备保持唤醒状态(请参阅我的 WakefulIntentService 了解相关内容)。
  • 我添加了onHandleIntent 代码。有任何想法吗?我应该将服务放在单独的进程中,还是让它与启动它的活动保持在同一个进程中?
  • “有什么想法吗?” ——嗯,嗯,那不是 Java 代码,所以我不确定你在做什么。 “我应该将服务放在一个单独的进程中,还是让它与启动它的活动保持在同一个进程中?” -- 在同一个进程中应该没问题。
  • 它在 Scala 中,所以或多或少相同,没有样板和括号。我没有从服务中得到任何异常,只是在 LogCat 中“服务死亡”,然后是“计划重启”,所以我假设系统只是杀死了它,即使它在前台。
  • 是的,这不应该发生,尤其是startForeground()。不知道你发生了什么事。

标签: android service intentservice


【解决方案1】:

使用 startForeground 有几个原因,但我一辈子都想不出在 IntentService 上使用 startForeground 的理由! IntentService 应该用于在后台线程上不间断地执行长时间运行的任务,而您希望从中获得持久的结果。

【讨论】:

  • 而且...这正是我想要做的。如果我不使用`startForeground`,服务会在下载过程中被系统杀死。
  • 回想一下,您可能实际上是对的,尤其是关于 不间断 部分。我正在尝试找到一种方法来通过通知操作按钮中途取消下载,根据文档,IntentService 在处理下载之前不会收到另一个意图。根据this,我也许可以使用BroadcastReceiver 的想法。
【解决方案2】:

我发现了如何正确实现它:

  • 不要在前台使用NotificationManager 中的notify 方法。根据this,如果要更新通知,您必须再次使用startForeground。 (这导致我的服务被系统杀死)

  • startForeground 中有一个 weird quirk,如果 ID 为 0,则它不显示通知。

  • 最后,我应该考虑一下,但this question 给出了一个很好的深入回答,说明了如何检查服务是否确实在前台。

(System Monitor 应用程序中出色的飞行网络监视器还帮助我检查上传是否仍在运行,而我正在启动其他应用程序以尝试触发“服务死亡”消息) em>

【讨论】:

  • 嘿,“系统监视器”应用程序链接已损坏!你能纠正一下吗?
猜你喜欢
  • 2020-08-08
  • 2012-04-23
  • 2012-02-06
  • 2014-10-27
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多