2010-08-02 43 views
15

在我的Android應用程序,我打電話都startServicebindService我是否需要爲Android服務調用unbindService和stopService?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

後來,我嘗試都unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

但是,我上調用unbindService異常。如果我刪除了此通話,則該應用似乎可以通過stopService通話正常運行。

我做錯了什麼?我認爲bindService呼叫必須與unbindService呼叫相關聯,並且startService呼叫必須與stopService呼叫相關聯。雖然這似乎並不是這種情況。

+0

你有沒有想過這個?我遇到了同樣的事情,併爲我自己評論了unbindService(conn)。似乎沒問題,但就像你一樣,我的直覺說背景中的東西不會喜歡它。 – 2010-12-16 03:34:58

回答

24

爲stopService的Android文檔()指出:

注意,如果停止服務仍具有綁定到它與BIND_AUTO_CREATE集ServiceConnection對象,也不會被破壞,直到所有這些綁定被刪除。有關服務生命週期的更多詳細信息,請參閱服務文檔。

所以打電話stopService()第一,然後unbindService()應該工作(它對我有用)。

+1

啊,所以這聽起來像我的'unbindService'和'stopService'的順序是倒退的,我明白了。 – 2011-02-20 21:04:20

+0

謝謝,這幫助了我!我有BIND_AUTO_CREATE使用和unbindService()幫助解決ServiceConnection泄漏的問題。 – lomza 2013-01-30 09:30:44

+0

@Matt哈金斯,所以你們的意思是首先解除綁定,然後停止? – 2014-11-19 12:40:35

5

正如你所見,here它取決於你想要達到什麼以及你如何綁定服務。如果您想要長時間引用該服務,最好使用bindService而不是startService。如果在bindService方法中使用了標誌BIND_AUTO_CREATE,那麼您不必調用startService,因爲服務在必要時自動啓動。

如果您調用unBind服務,那麼您對服務的關聯將被刪除。你不必'明確停止服務,但你可以。但需要注意的是,如果您調用unBind(),則該服務可以隨時停止。

+1

謝謝,但我一直在那裏,並不清楚我是否需​​要解除綁定並停止服務,如果我手動啓動它,然後用BIND_AUTO_CREATE標誌綁定到它。 – 2010-08-05 16:28:43

8

一個疑難雜症,我打這個:

確保您撥打unbindService上,你叫bindService相同的上下文。就我而言,我是做了以下綁定它:

Context c = getApplicationContext(); 
c.bindService(...); 

然後解除綁定,只是:

unbindService(...); 

確保兩者綁定和取消綁定使用了相同的情況下解決了這個問題。

+1

謝謝 - 剛剛被這個絆倒了 – SteelBytes 2012-09-29 06:31:50

相關問題