我的家園

          我的家園

          一、bindService簡介

          bindService是綁定Service服務,執行service服務中的邏輯流程。

          service通過Context.startService()方法開始,通過Context.stopService()方法停止;也可以通過Service.stopSelf()方法或者Service.stopSelfResult()方法來停止自己。只要調用一次stopService()方法便可以停止服務,無論之前它被調用了多少次的啟動服務方法。

           

          客戶端建立一個與Service的鏈接,并使用此鏈接與Service進行通話,通過Context.bindService()方法來綁定服務,Context.unbindService()方法來關閉服務。多個客戶端可以綁定同一個服務,如果Service還未被啟動,bindService()方法可以啟動服務。

           

          上面startService()和bindService()兩種模式是完全獨立的。你可以綁定一個已經通過startService()方法啟動的服務。例如:一個后臺播放音樂服務可以通過startService(intend)對象來播放音樂。可能用戶在播放過程中要執行一些操作比如獲取歌曲的一些信息,此時activity可以通過調用bindServices()方法與Service建立連接。這種情況下,stopServices()方法實際上不會停止服務,直到最后一次綁定關閉。


          二、bindService啟動流程

          context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
           

          onBind()將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service的實例、運行狀態或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。 

          所以調用bindService的生命周期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。

          在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調用一次。詳見:Android Service 服務(一)—— Service


          三、bindService生命周期

          像一個activity那樣,一個service有些可以用來改變狀態的生命周期方法,但是比activity的方法少,service生命周期方法只有三個public

             void onCreate()

             void onStart(Intent intent)

             void onDestroy()

          通過實現這三個生命周期方法,你可以監聽service的兩個嵌套循環的生命周期:

          1、整個生命周期

           service的整個生命周期是在onCreate()和onDestroy()方法之間。和activity一樣,在onCreate()方法里初始化,在onDestroy()方法里釋放資源。例如,一個背景音樂播放服務可以在onCreate()方法里播放,在onDestroy()方法里停止。

           

          2、活動的生命周期

           service的活動生命周期是在onStart()之后,這個發法會處理通過startServices()方法傳遞來的Intent對象。音樂service可以通過開打intent對象來找到要播放的音樂,然后開始后臺播放。注: service停止時沒有相應的回調方法,即沒有onStop()方法。

           

          onCreate()方法和onDestroy()方法是針對所有的services,無論它們是否啟動,通過Context.startService()和Context.bindService()方法都可以訪問執行。然而,只有通過startService()方法啟動service服務時才會調用onStart()方法

           

          如果一個service允許別人綁定,那么需要實現以下額外的方法:

                 IBinder onBind(Intent intent)

                 boolean onUnbind(Intent intent)

                 void onRebind(Intent intent)

          onBind()回調方法會繼續傳遞通過bindService()傳遞來的intent對像

          onUnbind()會處理傳遞給unbindService()的intent對象。如果service允許綁定,onBind()會返回客戶端與服務互相聯系的通信句柄(實例)。

          如果建立了一個新的客戶端與服務的鏈接,onUnbind()方法可以請求調用onRebind()方法。


          記住任何服務,無論它怎樣建立,都默認客戶端可以鏈接,所以任何的service能夠接收onBind()和onUnbind()方法


          四、bindService示例

          Activity


          Service


          AndroidManifest.xml



          五、代碼解析

          1、 Activity中,Intent intent = new Intent("com.homer.bind.bindService"); 構建一個service的action,然后bindService(intent, sc, Context.BIND_AUTO_CREATE); 綁定服務

          2、 Activity中,通過private ServiceConnection sc = new ServiceConnection() 建立一個Service連接,onServiceConnected()獲取Service實例,onServiceDisconnected()釋放連接

          3、 Service中,重載onBind(Intent intent)方法,返回Service實例(即BindMusicService)給Activity,然后執行onCreate()函數(注:bindService不執行onStart()函數)

          4、 Activity中,通過返回的Service實例musicService,執行音樂播放的操作(play、pause、stop等)


          六、Remote Service拓展

          通常每個應用程序都在它自己的進程內運行,但有時需要在進程之間傳遞對象(IPC通信),你可以通過應用程序UI的方式寫個運行在一個不同的進程中的service。在android平臺中,一個進程通常不能訪問其它進程中的內存區域。所以,他們需要把對象拆分成操作系統能理解的簡單形式,以便偽裝成對象跨越邊界訪問。編寫這種偽裝代碼相當的枯燥乏味,好在android為我們提供了AIDL工具可以來做這件事。
           
          AIDL(android接口描述語言)是一個IDL語言,它可以生成一段代碼,可以使在一個android設備上運行的兩個進程使用內部通信進程進行交互。如果你需要在一個進程中(例如在一個Activity中)訪問另一個進程中(例如一個Service)某個對象的方法,你就可以使用AIDL來生成這樣的代碼來偽裝傳遞各種參數
           
          要使用AIDL,Service需要以aidl文件的方式提供服務接口,AIDL工具將生成一個相應的java接口,并且在生成的服務接口中包含一個功能調用的stub服務樁類。Service的實現類需要去繼承這個stub服務樁類。Service的onBind方法會返回實現類的對象,之后你就可以使用它了,參見下例:

          IMusicControlService.aidl


          使用eclipse的Android插件,會根據這個aidl文件生成一個Java接口類,生成的接口類中會有一個內部類Stub類,Service來繼承該Stub類:
          Service

          客戶端(Activity)應用連接到這個Service時,onServiceConnected方法將被調用,客戶端就可以獲得IBinder對象。參看下面的客戶端onServiceConnected方法:

          Activity


          Remote Service流程總結:

          1、 Activity(客戶端)中,Intent intent = new Intent("com.homer.remote.remoteMusicReceiver");構建intent,然后bindService(intent, sc, Context.BIND_AUTO_CREATE);綁定服務

          2、 Activity(客戶端)中,通過ServiceConnection()重載onServiceConnected()建立連接,獲取Service.Stub實例;onServiceDisconnected()釋放連接(與bindService類似)

          3、 Service中,通過重載onBind(Intent intent) 返回Service.Stub實例,但Service.Stub類是由aidl文件生成的接口類中的一個內部類Stub類,Service來繼承該Stub類

          4、 Activity中,通過操作Service實例(musicService),執行音樂播放操作(play、pause、stop等)


          源碼下載



          參考推薦:

          Service (android developer)

          Android Service 服務(一)—— Service

          Android Service 服務(二)—— BroadcastReceiver

          android中service和aidl詳細整理

          Android Service AIDL

          android筆記--Service與AIDL



          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 鞍山市| 溧阳市| 长葛市| 酉阳| 宁强县| 韶关市| 明星| 乐平市| 沁阳市| 罗定市| 兴海县| 灵武市| 阿勒泰市| 凌源市| 新竹市| 乾安县| 东乌珠穆沁旗| 花垣县| 汕头市| 安溪县| 双江| 台南市| 茶陵县| 宁海县| 肇源县| 疏附县| 滕州市| 元朗区| 池州市| 横山县| 浦江县| 虞城县| 长治县| 进贤县| 织金县| 塘沽区| 怀柔区| 敖汉旗| 繁昌县| 义乌市| 泰来县|