天天看點

Android服務類Service具體解析

service有什麼作用?

很多人不明确service是用來幹嘛的。事實上service作為android四大元件之中的一個,能夠了解為一個執行在背景的activity。它适用于處理一些不幹擾使用者的長時間的背景操作,比方你播放器播放音樂之後跳到其他頁面,音樂須要繼續播放。那麼這個時候就能夠将音樂的播放一直執行在背景服務中,須要啟動播放的時候就通過activity去啟動服務。再通過服務去調用播放,須要停止的時候就停止服務。

有人可能會問,thread也能夠實作背景執行,為什麼不用thread而使用service呢?

service和thread是全然不同的兩個概念,thread是子線程,是與主線程沒有交集的。而service是執行在主線程上的。是與主線程有交集。當然你會說為什麼服務執行在主線程中不會反而影響性能嗎為何還要用它?事實上service作為android系統元件。是與activity等立的,我們全然能夠在當中定義子線程進行背景操作。假設須要大量的背景費時資料處理操作,最好的方式是在service中開子線程。而不是直接開一個子線程,這樣是為了提高子線程的優先級。而不會輕易被系統殺掉。

thread是獨立于主線程的,即使activity結束了,假如你沒有主動對它的子線程進行關閉。thread仍有可能還在默默執行着,這個時候。你已經控制不到這些子線程了由于你已經把持有該activity給結束掉了,這樣對于程式非常不安全。

舉個樣例:假設你的應用是一個聊天的應用,須要建立一個thread每隔一小段時間就去訪問server并實時顯示有沒有人發送了消息給你,那這個時候當你跳轉到别的activity比方個人設定等頁面,而原來持有該thread的activity已經finfish,等你回去的時候已經控制不了你剛才在聊天activity建立的那個子線程了,相同也就無法正常關閉這些子線程了。那麼這個時候就須要service了,由于service是獨立于activity的,能夠在當中建立子線程。即使activity關閉了。也能夠操作管理或者關閉這些子線程。并且不service也不是和activity一一相應,能夠有多個activity相應一個service,這些thread是無法做到的。

service的用法:

原始方式建立服務:

定義一個類為myservice,繼承自service。并實作當中唯一的抽象方法:onbind(),其用處見下文:

這樣一個最原始的服務類就建立完畢,接下來我們要在activity中去啟動它(通過intent啟動):

這個時候我跑一下程式。會發現程式崩潰了。報錯:android:content:activitynotfoundexception:unable to find exnlicit activity class。問題就在于service也是android四大元件之中的一個。必須要在androidmainfest.xml檔案裡注冊這個服務:

Android服務類Service具體解析

注冊完畢之後再執行一遍。便成功啟動服務。

怎樣停止服務:

綁定方式建立服務:

以上是通過startservice方式啟動服務,這樣的情況下除非主動關閉,不然即使activity關閉了,服務依然能夠在背景一直執行

還有第二種能夠通過與activity綁定的服務,這樣的情況下一旦activity關閉了,服務也會相應關閉:

這時候就須要調用我們一開始說的onbind方法,binder在這個時候就相當于連接配接點:

在我們自己定義的myservice類中。加入一個ibinder對象,并建立一個mybinder内部類,在裡面定義一個方法能夠獲得目前服務,并且重寫onbind以及onunbind方法:

這樣的方式下啟動服務須要通過調用onbind方法:

能夠看到有3個參數,第一個即傳入啟動該myservice的intent,第二個傳入的是一個serviceconnection對象。第三個是調用系統的變量表示自己主動綁定,當中,connection的建立例如以下:

停止服務:通過調用onunbind方法,傳入剛才的connection。就會停止服務

上文我們用兩種方式示範了怎樣建立一個初始的service,但會有疑問:怎樣檢視service究竟執行了沒有?

調用這種方法,并傳入目前activity的context,以及服務名:包名+服務的類名(比如:com.example.myservice)

假設結果傳回true則表示正在執行,false表示已經關閉。

service的生命周期:

原始方式的生命周期:

我們能夠通過重寫service中的oncreate、onstartcommand、ondestroy方法并分别列印日志來進行檢視:

在布局檔案裡建立兩個button:

Android服務類Service具體解析

代碼調用:

執行程式,點選啟動服務button,檢視logcat列印:

Android服務類Service具體解析

再點選多幾次啟動服務button:

Android服務類Service具體解析

點選關閉服務button:

Android服務類Service具體解析

能夠看出,當我們第一次點選啟動服務時。調用了服務的oncreate方法。當我們再點選多次啟動時,僅僅調用服務的onstartcommand方法,點選關閉的時候,調用了服務的ondestroy方法。是以我們大概了解了服務的生命周期:

1.第一次啟動服務時。調用oncreate

2.第二次啟動服務時,不會再調用oncreate而是調用onstartcommand

3.關閉服務時。調用ondestroy銷毀

流程圖例如以下:

Android服務類Service具體解析

綁定方式的生命周期:

代碼上文已經講述,這裡不再描寫叙述,同理在onbind和onunbind方法中列印日志,可得到其執行流程例如以下:

oncreate --> onbind(僅僅一次,不可多次綁定) --> onunbind --> ondestory