2010-09-11 105 views
29

如何確保只創建一個服務實例?僅創建一個服務實例(Android)

我也查了一些功能與日誌(WeatherService的是誰擴展服務類):

Log.i(TAG, "Start Id:" + WeatherService.this.hashCode()); 
Log.i(TAG, "End Id:" + WeatherService.this.hashCode()); 

它給不同的散列碼,即使我相信,同樣的功能正在運行兩次(下載):

09-12 01:00:55.195: INFO/WeatherService(7222): Start Id:1137653208 
09-12 01:00:57.235: INFO/WeatherService(7222): Start Id:1137654296 
09-12 01:00:59.035: INFO/WeatherService(7222): Start Id:1138806536 
09-12 01:01:39.085: INFO/WeatherService(7222): End Id:1137654296 
09-12 01:01:39.265: INFO/WeatherService(7222): Start Id:1137654296 
09-12 01:02:22.175: INFO/WeatherService(7222): End Id:1137653208 
09-12 01:02:24.815: INFO/WeatherService(7222): End Id:1138806536 
09-12 01:02:24.836: INFO/WeatherService(7222): Start Id:1138806536 
09-12 01:02:40.275: INFO/WeatherService(7222): End Id:1137654296 

我一個活動綁定到服務提供:

bindService(new Intent(getApplicationContext(), WeatherService.class) 
           ,mServiceConnection, BIND_AUTO_CREATE); 

服務可以運行幾分鐘直到完成,因此服務可以綁定到/由許多活動創建

+0

也看到這個頁面,我覺得有一個有用的解釋,以及:http://stackoverflow.com/questions/2518238/does-startservice-create-a-new-service-instance-or-使用現有的一個 – 2013-04-25 13:37:10

回答

27

如何確保只創建一個服務實例?

只能有給定Service的一個實例。

它給出了不同的哈希碼,即使我確信同一個函數運行兩次(下載)。

然後this不是Service。或者,該服務已被銷燬並在日誌之間重新創建。

,直到它完成該服務可以爲分鐘運行一次,因此該服務可以通過很多活動

然後Service可能正在破壞並重新創建綁定到/創建 。如果您需要該服務運行幾分鐘,除了呼叫bindService()unbindService()之外,還需要使用startService()stopSelf()。或者,也許根本不需要綁定,在這種情況下,您可能會考慮使用IntentService,因爲這會自動爲您提供一個後臺線程,用於執行下載。

+0

感謝您的信息! – Wroclai 2010-09-11 22:44:56

+0

當作業完成後,我調用回調函數,這就是爲什麼我使用bindService(使用AIDL)的原因。我現在已經嘗試在開始和結束時進行登錄,並且很明顯,在創建新實例之前它沒有完成/銷燬。我還使用了WeatherService.this.hashCode(),其中WeatherService是擴展Service的類。 – 2010-09-11 22:54:38

+0

哦,這意味着它只有一個服務將開始?如果它再次召回oncreate不會被打電話,但只有onstart – 2011-05-02 11:26:02

8

我經歷過類似的情況。
如果您已按照以下方式編寫,則可以創建一個實例。

bindService(new Intent(getApplicationContext(), WeatherService.class), mServiceConnection, BIND_AUTO_CREATE); 

試着寫一次如下。

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE); 
+0

這正是我想念的東西,因爲,看起來你可以多次啓動一項服務(我有一個服務器應該每隔5秒顯示一次敬酒,並且它顯示了2次,3次以及更多次烤麪包,直到我用了這個技巧,每次我使用bindService)謝謝! – liltof 2015-08-23 16:02:26