2013-06-26 3 views
2

Каков наилучший способ позволить Android-приложениям загружать потенциально большой файл на сервер по запросу пользователя?Загрузка файлов в службу 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) 
    } 
} 
+1

Возможно, вы разместите код для этой услуги. Кроме того, имейте в виду, что «IntentService» имеет свой собственный фоновый поток (так что не вилки свои) и что он не поддерживает пробуждение устройства (см. Мой 'WakefulIntentService' для того, кто это делает). – CommonsWare

+0

Я добавил код 'onHandleIntent'. Есть идеи? Должен ли я помещать службу в отдельный процесс, или это нормально, чтобы он оставался в том же процессе, что и активность, которая начала его? –

+0

«Любые идеи?» - Ну, это не код Java, поэтому я не уверен, что вы там делаете. «Должен ли я помещать службу в отдельный процесс, или это нормально, чтобы он оставался в том же процессе, что и активность, которая начала его?» - иметь его в том же процессе должно быть хорошо. – CommonsWare

ответ

0

я узнал, как осуществить это правильно:

  • ли не использовать метод notify из NotificationManager в то время как вы находитесь в на переднем плане. Согласно this, вы должны снова использовать startForeground, если хотите обновить уведомление. (Это было причиной моей службы, чтобы убить системой)

  • Там в weird quirk в startForeground, что делает его не показывать уведомления, если идентификатор 0.

  • Наконец, я должен был подумать об этом, но this question дает хороший подробный ответ о том, как проверить, действительно ли служба действительно находится на переднем плане.

(Фантастический летающие сетевой монитор из System Monitor приложения также помог мне, чтобы проверить, если загрузка была все еще работает, когда я начинал другие приложения, чтобы попытаться вызвать «услуга умерла» сообщение)

0

Есть несколько причин использовать startForeground, но я не могу на всю жизнь подумать о причине использовать startForeground в IntentService! IntentService следует использовать для выполнения длительных задач в фоновом потоке без перерывов, из которых вы хотите получить постоянные результаты.

+0

И ... это именно то, что я хочу сделать. Если я не использую 'startForeground', служба будет убита системой на полпути через загрузку. –

+0

Думая об этом, вы действительно можете быть правы, особенно о части * без перерыва *.Я пытаюсь найти способ отменить загрузку на полпути с помощью кнопки действия уведомления, и согласно документам «IntentService» не получит другого намерения до того, как он обработает загрузку. Согласно [this] (http://stackoverflow.com/questions/15524280/service-vs-intent-service?rq=1), я могу использовать мысль «BroadcastReceiver». –