3

让 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)
  }
}
4

2 回答 2

1

我发现了如何正确实施:

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

  • 有一个奇怪的怪癖,如果 ID 为 0 startForeground,它不会显示通知。

  • 最后,我应该考虑一下,但是这个问题就如何检查服务是否确实在前台提供了一个很好的深入答案。

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

于 2013-06-26T21:45:28.723 回答
0

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

于 2013-06-27T00:06:13.023 回答