2011-11-05 72 views
86

如果我有以下代碼:如果服務多次啓動會發生什麼?

Intent intent = new Intent(this,DownloadService.class);  
for(int i=0;i<filesArray.length;i++){   
    startService(intent);   
} 

在這段代碼DownloadService延伸IntentService

所以現在當我打電話startService(intent)這是不是意味着我開始了新的服務,每次startService(intent)被稱爲或是否意味着DownloadService運行一次,然後每次我打電話時startService(intent)它只是通過不同意圖與不同的startId。

這是否有意義,這是哪種情況?

回答

123

服務將只在一個實例中運行。但是,每次啓動服務時,都會調用onStartCommand()方法。

這是記錄here

+1

謝謝。它還表示:「startService()方法立即返回,Android系統調用服務的onStartCommand()方法。如果服務尚未運行,系統首先調用onCreate(),然後調用onStartCommand()。因此,如果服務已經在運行,那麼系統將跳過onCreate()方法並僅調用onStartCommand()或者什麼? – bytebiscuit

+0

我真的不知道,但我很確定是這種情況(如果服務已經創建,使得很多人不會調用'onCreate()')。應該很容易確定是否在兩個回調中都放置了Log.i(),並檢查LogCat。 –

+0

剛剛做到了這一點......奇怪的是,它在最後一次startService()調用後啓動了onCreate! – bytebiscuit

7

完全正確的。 僅爲應用程序進程創建一個服務實例。 而當你打電話onStart();再次,只有onStartCommand()被調用,並且新的Intent被傳遞給onStartCommand()方法。

注意: onCreate()不會再次被調用。

關於調用bindService()多次:

當你調用bindService()多次,然後再用於服務只有一個實例和Android運行時返回相同的IBinder對象客戶。

均值,onBind()不會被多次調用。並且只返回緩存的IBinder對象。

+0

是否必須爲每個相應的'onStartCommand'調用'onStop()'? –

+6

@IgorGanapolsky:首先,Service中沒有onStop()這種回調方法。我們需要調用stopService()或stopSelf()來停止服務。當onStartCommand()多次被多次調用時,我們只需要調用stopSelf()或stopService()一次。如果使用IntentService,則應該調用stopSelfResult(int id)傳遞來自onHandleIntent()的請求的開始標識,這將停止相應的啓動id請求,該請求位於IntentService的工作隊列中。希望這可以幫助。 –

2

向上面的答案添加一些可能對別人有用的信息是,startId onStartCommand()方法接收的每個startService()調用都不相同。同樣,如果我們在上面提到的for循環中寫入,使用onHandleIntent()編寫的代碼將按照for循環頻率定義的次數執行,但是按順序而不是並行執行.IntentService的概念創建一個工作隊列,並且每個請求都會啓動()觸發onStartCommand(),然後將意圖存儲在工作隊列中,然後將意圖逐一傳遞給onHandleIntent()。

相關問題