2012-12-09 71 views
30

這可能是個愚蠢的問題,但我想知道何時使用bindService以及何時使用startService當聰明地使用bindService和startService時

例如:

如果我使用bindServiceBIND_AUTO_CREATE,該服務將啓動,併爲這裏寫的自動創建:http://developer.android.com/reference/android/content/Context.html#BIND_AUTO_CREATE

當是聰明,然後使用bindServicestartService?我真的不明白這兩個正確的。

+0

可能重複的[android服務startService()和bindService()](http://stackoverflow.com/questions/3514287/android-service-startservice-and-bindservice) –

回答

55

如果您的呼叫組件(Activity)需要通過ServiceConnection與您開始的Service通信,則通常使用bindService()。如果您不想與Service通信,則只能使用startService()。您可以在服務和綁定服務之間看到下面的區別。

從文檔:

發起者

服務被 「啓動」,當一個應用程序組件(例如,活動)通過調用startService啓動它()。一旦開始,服務可以無限期地在後臺運行,即使啓動它的組件被銷燬。通常,啓動的服務執行單個操作,並且不會將結果返回給調用者。例如,它可能通過網絡下載或上傳文件。操作完成後,服務應該自行停止。

束縛

服務被「綁定」,當一個應用程序組件通過調用bindService結合它()。綁定服務提供了一個客戶端 - 服務器接口,允許組件與服務交互,發送請求,獲得結果,甚至跨進程使用進程間通信(IPC)。綁定服務只在另一個應用程序組件綁定到它時才運行。多個組件可以立即綁定到服務,但是當它們全部解除綁定時,服務將被銷燬。

你可以在這裏閱讀更多:Android ServicesBound Services

16

我@Ovidiu Latcu但有一個重要的注意事項達成一致: 使用綁定服務時,當啓動它的活動結束服務結束時, (如果它是與該服務綁定的唯一活動)。

所以,如果你想在後臺運行你的服務,而應用程序在後臺, (例如活動暫停,用戶不可見),那麼你必須啓動服務,而不必綁定它,並進行通信以BroadcastReceiver爲例。

+0

不錯的信息 –

+0

也可以啓動服務並在之後綁定它 - 這樣它將保持運行直到停止被調用。 – benchuk

+1

我會考慮從僅使用startService()開始的服務中獲得結果(使用'BroadcastReceiver'或其他選擇),並且他和客戶端之間沒有任何綁定,因爲**不好的做法**,因爲Ovidiu Latcu引用的** **開始**服務通常不會將result_返回給調用者(客戶端),與**綁定**服務相比,它提供了允許組件與服務交互的客戶端 - 服務器接口,發送請求,_receive結果_...。 – Eido95