天天看點

android Service(startService bindService)詳解以及全面總結

[color=red][size=medium][b]1.Service基本概念[/b][/size][/color]

[color=blue]Service是Android中四大元件之一[/color],[color=red]是一個沒有使用者界面的在背景運作執行耗時操作的應用元件。[/color]其他應用元件能夠啟動Service,并且當使用者切換到另外的應用場景,Service将持續在背景運作。另外,一個元件能夠綁定到一個service與之互動(IPC機制),例如,一個service可能會處理網絡操作,播放音樂,操作檔案I/O或者與内容提供者(content provider)互動,所有這些活動都是在背景進行。

[color=blue][b]那麼,什麼時候,我們需要使用service呢?[/b][/color]

我們知道,service是運作在背景的應用,對于使用者來說失去了被關注的焦點。[color=red]這就跟我們打開了音樂播放之後,便想去看看圖檔,這時候我們還不想音樂停止,這裡就會用到service;[/color]又例如,我們打開了一個下載下傳連結之後,我們肯定不想瞪着眼睛等他下載下傳完再去做别的事情,對吧?這時候如果我們想手機一邊在背景下載下傳,一邊可以讓我去看看新聞啥的,就要用到service。

[img]http://dl2.iteye.com/upload/attachment/0116/9790/4d124322-a92d-353e-9682-d3e604f6aa75.png[/img]

[color=blue][b]Service有兩種狀态,“啟動的”和“綁定”。[/b][/color]

[color=red][size=medium][b]2.Service生命周期[/b][/size][/color]

Service也有自己的生命周期,前面我們使用到的[b]onCreate,onStartCommand,onBind和onDestroy[/b]等方法都是在服務的生命周期内可能回調的方法。

一旦在項目的任何位置[color=red]調用了Context的startService(intent)方法[/color],相應的服務就會啟動起來,并回調[b]onStartCommand[/b]。如果 這個服務之前還沒建立過,onCreate()方法會先于onStartCommand()方法執行。

服務啟動了之後一直保持運作狀态,[b]直到stopService(intent)或stopSelf()方法被調用[/b]。

注意雖然每調用一次[color=red]startService()方法,onStartCommand()就會執行一次,但實際上每個服務都隻會存在一個執行個體。[/color]是以不管你調用了多少次startService(intent)方法,[b]隻需調用一次stopService()或stopSelf()方法[/b],服務就會停止下來了。

另外,還可以[b]調用Context的bindService()[/b]來擷取一個服務的持久連接配接,這時就會回調服務中的onBind()方法。類似地,如果這個服務之前還沒有建立過,[b]onCreate()方法會先于onBind()方法執行。[/b]之後,調用方可以擷取到onBind()方法裡傳回的IBinder對象的執行個體,這樣就能自由地和服務進行通信了。隻要調用方和服務之間的連接配接沒有斷開,服務就會一直保持運作狀态。

當調用了startService()方法後,又去調用stopService()方法,[b]這時服務中的onDestroy()方法就會執行,表示服務已經銷毀了。[/b]類似地,[b]當調用了bindService()方法後,又去調用unbindService()方法,onDestroy()方法也會執行[/b],這兩種情況都很好了解。但是需要注意,我們是完全有可能對一個服務既調用了startService()方法,又調用了bindService()方法的,這種情況下該如何才能讓服務銷毀掉?

根據android系統的機制,一個服務隻要被啟動或者綁定了之後就會一直處于運作狀态,[b]必須要讓以上兩種條件同時不滿足[/b],[color=red]服務才能被銷毀。[/color]是以,這種情況下需要同時調用[b]stopService()和unbindService()方法,onDestroy()方法才會執行。[/b]

[color=red][size=medium][b]3.案例[/b][/size][/color]

[color=red]ServiceDemo[/color]

[color=red]Manifest[/color]