1. 程式人生 > >Android Studio四大組件之Service

Android Studio四大組件之Service

service man 頁面 修改 src 抽象方法 activit timer 0ms

Service在Android運行在後臺,它沒有可視化界面,只是默默運行在後臺。我們以一個後臺定時器的例子清晰的說明Service的運行流程。
一、創建Service類
項目右鍵->New->Service新建一個名為Time人Service的Service。將自動在AndroidMainfest中聲明Service。
技術分享圖片
二、Service生命周期

  • 打開剛剛新建的TimerService,實現了一個onBind的方法。我們可以重寫Service的一些方法,深刻分析Service的生命周期。

  • 生命周期:
    ①onCreate->onStartCommand->onDestory。

    onCreate只有在服務創建的時候才會被調用,如果Service已經在運行中,這個方法將不會再被調用。
    過程:創建服務之後就會執行服務,onStartCommand中的執行代碼可以執行多次。
    技術分享圖片
    ②onBind->onUnbind。
    技術分享圖片
    可見onBind方法的返回類型是IBinder,這是一個接口,是一個客戶端-服務器接口,可以利用該接口實現Activity與Service之間的通信。

三、Service的啟動

  • 啟動方式有兩種:startService和bindService。
    startService,從方法可見參數是一個Intent,那顯而易見我們需要新建一個Intent,使得Activity與Service建立起聯系。
    使用該方法調用Service的話直接就是調用Service的onCreate方法。那停止服務的話就是stopService。
    技術分享圖片
    技術分享圖片
    bindService,如下截圖可見參數,分別是Intent,ServiceConnection和int類型的三個參數。根據感覺第一個Intent就是上面新建的Intent。第二個參數連接類就是實現Activity與Service之間的通信部分,第三個參數使用AS已經定義好的一個整形變量。BIND_AUTO_CREEATE。
    技術分享圖片
    下面具體闡述一下第二個參數,因為其還會重寫一些方法。
    技術分享圖片
    從函數名可預見其就是Activity與Service之間建立起聯系之後和斷開聯系之後所進行的一些操作。onServiceConnected函數的參數IBinder就是Service類中onBind方法所返回的IBinder。
    使用該方法調用Service的話它會先執行Service的onCreate方法,然後緊接著調用onBind方法。需要註意的是onBind調用之後只能通過onUnbind方法進行解綁,直接調用onDestory銷毀是不行的。
    下面我們將直接使用bindService啟動Service,介紹Activity與Service之間是如何進行通信的。startService是比較簡單。

四、bindService啟動服務,Activity與Service之間通信

  • 我們實現的是一個計時器服務,就是當用戶瀏覽此頁面五秒之後進行通知用戶。首先我們先在onCreate或者onBind方法中實現計時服務。(使用Timer,具體比較簡單,直接貼代碼)。主要就是使用了Timer的一個方法,在服務開啟5000ms的時候執行task中的代碼。
    技術分享圖片
    這裏我們新建一個線程主要是服務默認會使用主線程,這樣會影響正在運行的Activity的性能。

  • Activity給Service傳值
    我們新建一個Binder的子類myBinder,並創建實例,使得onBind方法中返回該實例。同時在該子類中實現一些方法,這樣Activity中onServiceConnected方法中的IBinder接口進行強轉成我們的myBinder類,然後就可以調用myBinder中的一些方法了。例如setData方法,Activity給Service傳值。
    Service端
    技術分享圖片
    Activity端調用:
    技術分享圖片

  • Service給Activity傳值
    如果說我們只是在調用服務時傳一個固定的值回來的話,我們也可以在myBinder中實現一個getData的方法,直接將值返回,但是我們是一個定時器,需要的是在五秒之後才返回,如果醬紫操作會造成message為空,因為onServiceConnected是在onBind執行時就會執行,onBind執行的時候提示語message還為空,只有在五秒時才會賦值給message。
    所以該如何操作呢?
    使用到回調機制。我們在Service中新建一個接口,該接口中定義給message賦值的抽象方法,在計時五秒之後主動暴露該接口。那Activity中就會重寫該接口中的方法進行處理service送出來的提示語message。
    Service端:
    技術分享圖片
    技術分享圖片
    Activity端:(因為服務是在一個子線程中執行,不能在Activity主線程中貿然將值改變,使用消息隊列處理機制。不然子線程可以修改主線程,醬紫很危險,也容易造成消息泄露的微危險)
    技術分享圖片
    技術分享圖片

預告:我們這個實現的是在一個進程中實現Service的調用,之後將會發布在不同進程中實現服務的調用,即在兩個APP中調用。同樣使用的是IBinder接口。

Android Studio四大組件之Service