2013-03-22 79 views
0

我有一個問題,我應該使用哪種類型的服務來運行我的應用程序中的數據上傳和下載。bindservice vs startService上傳/下載進程

具體來說,它似乎是一個綁定服務(通過調用bindService()獲得)真的更適用,因爲我的後臺工作不是無限期地運行,我的理解是,這實際上是使用startService/START_STICKY的目的。

這就是說,我正在長視頻上傳和下載,我做希望通過上傳/下載,無論發生了什麼事在應用程序的UI我的服務垃圾回收中途(發送到後臺等) 。據我瞭解,如果我有一個綁定服務,一旦所有連接都被綁定,它將被垃圾收集。這是否意味着我的綁定服務將在其所做的事情的中途停止?

任何人都可以在正確的方向指向我嗎?在此先感謝

+0

我建議看一下['IntentService'](http://developer.android.com/reference/android/app/IntentService.html)或者讓你的'Service' [在前臺運行](http:/ /developer.android.com/reference/android/app/Service.html#startForeground)和'Notification'。 – MCeley 2013-03-22 19:14:59

+0

由於潛在的併發問題,我實際上不能使用IntentService。我希望將這項服務用於幾種不同的事情,不僅僅是上傳和下載,而且我還需要其中一些操作來阻止彼此。發送到IntentServices的操作將始終按照我的理解連續運行?如果沒有,那麼這看起來是正確的解決方案。 – akhalsa 2013-03-22 19:18:20

+1

我對應用的後臺進程有混合服務。它充當'IntentService'來調度某些數據同步操作,但它可以被綁定到檢索進度更新。我允許該服務在後臺繼續下載,但我故意沒有執行。我的理解是,要防止服務被踢出去,您需要獲得前臺通知。 – 323go 2013-03-22 19:19:58

回答

0

通過調用startForeground使您的Service在前臺運行將向系統發出信號,告知系統查殺和/或垃圾回收服務會對用戶造成干擾。這將阻止系統清理您的服務,除非由於系統資源較低或功耗較低而無法完成。

要使Service在前臺運行,您需要給它一個Notification。這是可以做到像這樣:

Notification.Builder builder = new Notification.Builder(getApplicationContext()); 
builder.setSmallIcon(R.drawable.notification_icon); 
builder.setContentTitle("Your notification text"); 
builder.setProgress(100, 0, true); /* 0 out of 100 progress to start */ 
builder.setAutoCancel(false); 
builder.setOngoing(true); 
Notification notification = builder.getNotification(); 

/* NOTIFICATION_ID can just be a static int to identify your service's notification */ 
startForeground(NOTIFICATION_ID, notification); 

這是使用startForeground的一個非常基本的例子,但至少應該讓你在正確的方向。當您的操作完成後,您可以通過致電stopForeground向系統發信號通知您可以自由收集。

0

爲此首先讓我們回顧一下服務。根據Android文檔的服務是一個應用程序組件,它表示應用程序希望在不與用戶交互的情況下執行長時間運行的操作。 當您使用startService()時,您啓動的服務將在主線程上運行,但未連接到啓動它的Activity,因此您無法與其通信。 當您使用bindService()時,您將服務綁定到活動,並且它在活動未被殺死時釋放(設備釋放內存時調用或終止的onDestroy方法)。

我的建議是,您使用IntentService(搜索一個簡短的教程),因爲在這種情況下,您可以發送廣播到應用程序,它運行在不同的線程,然後您可以接收通知時,文件完成上傳。 您可以使用的另一種方法是使用JobScheduler(出現在Android 21上),以防止您需要不斷上傳/下載文件(類似於Evernote每隔N分鐘在後臺進行同步)。

希望它有幫助。