2

我正面臨着我的應用程序的一個奇怪問題。我有一個在後臺運行的LocationService。我管理其生命週期的方法是:啓動服務時bindService()和onBind()之間的延遲

  1. onResume,每一次活動都使用bindService(intent,serviceConnection, BIND_AUTO_CREATE)喜歡在需要時該服務會自動創建。
  2. onStop,每一次活動都使用unbindService(serviceConnection)
  3. 這工作,因爲開關的活動時,新ActivityonResume是老ActivityonStop方法

我已經是這個問題之前調用,可以說我從一開始主屏幕上,我用一個包含片段的活動啓動應用程序。函數調用的順序如下

  1. 活動onCreate - >setContentView這裏叫
  2. 活動onResume - >這裏bindService被調用,並應創建Service
  3. 片段onResume
  4. 服務onBind方法被稱爲

我的問題是爲什麼我的bindServiceonBind調用之間還有其他東西?我有一種感覺,這與線程問題有關。

+3

延遲是一個預期的行爲,因爲bindService()確實是一個異步調用,請參閱[這個答案](http://stackoverflow.com/questions/10802456/when-exactly-onserviceconnected-for-bounded-service - 將被稱爲/ 10807311#10807311)瞭解更多詳情。 – yorkw 2013-04-08 03:07:22

+0

謝謝,它並沒有說它是在文檔中的異步調用,這就是爲什麼我感到困惑。你想把它作爲答案嗎? – chopchop 2013-04-09 01:35:33

+0

嘿,我認爲我是不必要的冗長,但我沒有說過同樣的事情(我相信在發佈約克的評論之前)。我不打算得到賞金,但如果你認爲我的回答是錯誤的,請對此作出評論。 – Tom 2013-04-09 02:30:39

回答

2

嗯,這不是一個很好的答案,但爲什麼你的bindService()onBind()調用之間沒有別的東西?您似乎認爲當您調用綁定時,系統會立即創建並啓動您的服務,並且不提供此類保證。

您還沒有指定是否爲IntentService,或者只是一個普通的服務,這可能會影響服務啓動的速度,但我的回答是一樣的。

此外,我假設您的服務onBind()返回後,您的ServiceConnection對象被調用,如預期的那樣。

我說這不是基於閱讀任何明確的內容,而是因爲我有類似的經歷:我很驚訝和煩惱,在我的服務創建和我的ServiceConnection被調用之前需要多長時間,儘管我從服務的onBind非常快。 (我的碎片需要服務中的數據來創建初始用戶界面,所以創建服務的任何延遲意味着延遲向用戶顯示初始用戶界面。)

最後,我決定啓動我的服務使用意圖而不是綁定,例如

Intent si = new Intent(this, com.company.MyService.class); 
si.setAction(MyService.SVC_BIND); 
startService(si); 

然後我發送了MyService.SVC_UNBIND來代替調用unbind。當我在我的服務中收到UNBIND意圖時,我會清理,然後致電stopSelf()。這些是用戶操作 - 我只是將它們命名爲我如何使用它們。

我相信這是更快,但回顧我的代碼的意見,我沒有任何具體細節。請注意,這意味着沒有ServiceConnection,但我正在進行一些直接調用該服務的活動,並使用LocalBroadcastManager一個公平的位。

另一個選擇考慮(爲了使您的服務更快地啓動,如果這是您的目標?)是在Appliction.onCreate()中啓動它,而不是等待Activity.onResume()。所有這些選項都有必要做一些額外的工作,以確定何時停止服務,與您當前正常的計劃相比,這些工作將由您負責。