2012-02-08 47 views
4

當運行一大套測試套件時,我發現我的一個Android服務不再是單身。一個Android服務應該是單身人士,但使用ServiceTestCase時,我的引用計數高於1.(在onCreate中遞增,在onDestroy中遞減)。 從測試用例中調用startService或bindService應該會導致第二個onBind或onStartCommand,但不應該在第一個onDestroy之前導致第二個onCreate。測試時,爲什麼Android服務不是單身人士?

這是因爲單元測試繞過Zygote嗎?如果是這樣,我該如何解決這個問題?

回答

5

,我發現我的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以斜體表示。

+0

只有在調用stopSelf時以及最後一個解除綁定被調用時,纔會調用onDestroy,但由於此服務需要始終保持運行狀態,因此不會調用stopself。 所以你說的是我必須在onCreate()中實現自己的單身,因爲它可以被多次調用? – Huupke 2012-03-09 07:19:31

+0

Singleton由框架處理。根據[開發指南](http://developer.android.com/guide/topics/fundamentals/services.html#Basics):_系統在第一次創建服務時調用Service.onCreate(),如果服務是已經運行,不調用此方法。每次調用startService()時都會調用Service.onStartCommand()。我已經更新了我的答案。 – yorkw 2012-03-09 07:51:13

+1

所以我的問題仍然是因爲我仍然看到onCreate調用兩次! – Huupke 2012-03-09 09:15:01

相關問題