,我發現我的Android服務的一個不是獨居了
Android服務是單身無論你的起點/綁定它實際運行環境下或在儀表測試。通過單例,我的意思是生活在堆中的一個獨特的對象,它可以有多個引用指向它。
從測試用例調用startService或bindService應導致第二onBind或onStartCommand
,這是不正確的,因爲官方的開發者指南中指出:「多個客戶端可以連接到服務然而,只有當第一個客戶端綁定時,系統纔會調用你的服務的onBind()方法來檢索IBinder,然後系統將同一個IBinder傳遞給綁定的任何其他客戶端,而無需再次調用onBind()。
,但第一的onDestroy
根據官方的開發者指南之前,不應該導致第二的onCreate:「如果你讓你的服務要啓動和約束,那麼當服務已經啓動,系統不會在所有客戶端解除綁定時銷燬該服務,而必須通過調用stopSelf()或stopService()來明確停止該服務。「
因此,在第一次調用start或bind service時,調用Service.onCreate()方法((在調用onStartCommand()或onBind())之前創建一個唯一對象返回堆引用(引用計數= 1),之後,每次調用start或bind服務時,都會執行Service.onStartCommand(),而不會通過調用Service.onCreate()堆,而是將第二個參考點返回到同一個對象(現在引用計數= 2),每次調用解除綁定時,引用計數減1,直到引用計數達到0,調用Service.onDestroy()方法,最後清理堆上的物體
你可以找到所有細節I ref從官方開發指南here以斜體表示。
只有在調用stopSelf時以及最後一個解除綁定被調用時,纔會調用onDestroy,但由於此服務需要始終保持運行狀態,因此不會調用stopself。 所以你說的是我必須在onCreate()中實現自己的單身,因爲它可以被多次調用? – Huupke 2012-03-09 07:19:31
Singleton由框架處理。根據[開發指南](http://developer.android.com/guide/topics/fundamentals/services.html#Basics):_系統在第一次創建服務時調用Service.onCreate(),如果服務是已經運行,不調用此方法。每次調用startService()時都會調用Service.onStartCommand()。我已經更新了我的答案。 – yorkw 2012-03-09 07:51:13
所以我的問題仍然是因爲我仍然看到onCreate調用兩次! – Huupke 2012-03-09 09:15:01