Service

service既不是一個單獨的進程,又不是一個單獨的線程;
聽歌的服務多用service實現(和activity相比的優勢),可以長時間的保存在後臺,系統不到萬不得已不會殺掉,同時service也不需要界面。

只要service不死,MediaPlayer就一直持有

service的生命週期

啓動和停止Service的兩種方式
1.Started:context.startService();context.stopService(). 該方法適用於服務和activity之間沒有調用交互的情況
2.Bound:context.bindService();context.unbindService() 該方式可以傳遞參數或者方法調用,通過ServiceConnection的內部類實現來連接Service和Activity。

這裏寫圖片描述

必須要在Manifest中聲明service:如果沒聲明,編譯器不會報錯(activity會報錯)

<service android:name=".MusicService"/>
//.表示根目錄,也可以寫全爲:com.example.jinhua.MusicService

音樂資源文件放在res/raw,

//在oncreare()方法裏創建MediaPlayer對象
mediaPlayer = MediaPlayer.create(this,R.raw.libai);

第二種方式: Bind Service 繼承自Binder類

首先bindService()方法,把serviceConnection作爲參數給傳進去,實際上serviceConnection是傳給Service,Service會把onBind的Ibinder傳回給剛剛傳進來的serviceConnection(一個service要想能夠被其他組件綁定,那麼它的 onBind() 方法必須被實現,且必須返回一個 IBinder 對象,然後其他組件可以通過這個 IBinder 對象與該 service 進行通訊。),在serviceConnection裏我們就會收到service其實是Binder,我們又在Binder中構造了service,即return service,所以通過這種方法可以獲取service,service裏面又可以創建公共方法,可以通過service對象的這些方法獲取裏面數據,這是就可以互相通信。

IBinder是負責service和外界(如activity)的通信

將IBinder強轉爲我們本身的Binder;

bindService注意:
1、bindService(或者startService)後,service的onCreate方法只執行一次,執行後service就運行起來了,如果不unbindService的話,service就不會被關閉onDestroy的,即使stopService(或者unbindService)也沒有用。

2、
startService()
bindService()

(1)先執行startService的onCreate方法,然後在bindService;爲什麼要用bindService,是爲了讓service和一個應用界面、組件進行綁定,一旦綁定了,service和這個應用界面就會同生死共存亡,當界面被銷燬掉時,綁定的service就會調用unbindService,然後stopService,然後onDestroy然後被銷燬。
(2)如果界面沒有被銷燬,而又綁定了界面,這時調用stopService,是不會銷燬service的。
這就是bind和startService、stopService的區別。
(3)如果沒有bind,用的是startService、stopService,若界面銷燬了,service還會在後臺進行。

IntentService

異步處理服務

IBinder是負責service和外界(如activity)的通信

將IBinder強轉爲我們本身的Binder;

bindService注意:
1、bindService(或者startService)後,service的onCreate方法只執行一次,執行後service就運行起來了,如果不unbindService的話,service就不會被關閉onDestroy的,即使stopService(或者unbindService)也沒有用。

2、
startService()
bindService()

(1)先執行startService的onCreate方法,然後在bindService;爲什麼要用bindService,是爲了讓service和一個應用界面、組件進行綁定,一旦綁定了,service和這個應用界面就會同生死共存亡,當界面被銷燬掉時,綁定的service就會調用unbindService,然後stopService,然後onDestroy然後被銷燬。
(2)如果界面沒有被銷燬,而又綁定了界面,這時調用stopService,是不會銷燬service的。
這就是bind和startService、stopService的區別。
(3)如果沒有bind,用的是startService、stopService,若界面銷燬了,service還會在後臺進行。

IntentService 異步處理服務
異步處理服務:各自幹各自的事,A做好了通知一下B就好。
同步處理服務的意思:A執行完了把結果給B,B再執行。
(1)onStartCommand()//開始的時候把intent給你
(2)onHandleIntent()//處理intent數據,這裏的intent是由startService或者bindService傳的
(3)在什麼場景下使用:
什麼時候用Service,什麼時候用IntentService?當有需要把任務用隊列來分配時用IntentService,當不需要時,比如後臺播放,就用Service。

總結:
(1)Service的基本概念
(2)如何使用
1、Start
2、Bind
(3)IntentService
(4)Service的生命週期
(5)Bound Service的生命週期

小技巧:
1、Service是一個進程或者線程嗎?都不是。
2、能做耗時操作嗎?不能,需要new一個Thread來做耗時操作。
3、用它主要來做什麼?主要用來在後臺長久的運行。

發佈了53 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章