2013-06-26 77 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(這是導致我的服務來獲得系統終止)

  • 有一個在startForegroundweird quirk,使得它顯示通知,如果ID爲0

  • 最後,我應該想到關於它,但this question就如何檢查服務是否確實處於前景給出了很好的深入解答。

(從System Monitor應用的夢幻般的飛行網絡監控也幫了我很多,以檢查是否上傳仍在運行,而我開始其他應用程序,試圖觸發「服務去世」的消息)

0

有幾個原因使用startForeground,但我不能在我的生活中想到在IntentService上使用startForeground的原因!應該使用IntentService在後臺線程上執行長時間運行的任務,而不會中斷,從中獲得持久結果。

+0

而......這正是我想要做的。如果我不使用'startForeground',服務在下載過程中被系統殺死。 –

+0

回想起來,你可能確實是對的,特別是關於*沒有中斷*部分。我試圖找到一種方法來取消下載中途通過通知操作按鈕,並根據文檔「IntentService」將不會收到另一個意圖之前,它已經處理下載。根據[this](http://stackoverflow.com/questions/15524280/service-vs-intent-service?rq=1)我可能能夠使用'BroadcastReceiver'思想。 –