安卓四大組件之Service

  • 服務(wù)介紹

  • 服務(wù)類型

  • 服務(wù)基本用法

  • 服務(wù)生命周期

  • 服務(wù)更多技巧


  • 服務(wù)介紹
    服務(wù)是Android中實現(xiàn)程序后臺運行的解決方案,它非常適合用于去執(zhí)行那些不需要和用戶交互而且還要長期運行的任務(wù)。服務(wù)的運行不依賴任何用戶界面,即使當程序被切換到后臺,或者用戶打開了另外一個應(yīng)用程序,服務(wù)仍然能后保持正常運行。不過需要注意的是,服務(wù)并不是運行在一個獨立的進程中,而是依賴于創(chuàng)建服務(wù)時所在的應(yīng)用程序進程。當某個應(yīng)用程序進程被殺掉時,所有依賴于該進程的服務(wù)也會停滯運行。另外服務(wù)并不會自動開啟線程,所有的代碼都是默認運行在主線程中。我們需要在服務(wù)內(nèi)部手動創(chuàng)建子線程,并在這里執(zhí)行具體的任務(wù)。
  • 服務(wù)類型
    使用范圍
    1.本地服務(wù):用于應(yīng)用程序內(nèi)部
    功能:用于實現(xiàn)應(yīng)用程序自己的一些耗時任務(wù),并不占用應(yīng)用程序比如Activity所屬線程,而是單開線程后臺執(zhí)行。
    使用:在Service可以調(diào)用Context.startService啟動,調(diào)用Context.stopService結(jié)束。在內(nèi)部可以調(diào)用Service.stopSelf或Service.stopSelfResult來自己停止。無論調(diào)用了多少次startService(),都只需調(diào)用一次stopService()來停止。

2.遠程服務(wù)(Remote Sercie):用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間
功能:可被其他應(yīng)用程序復用,比如天氣預報服務(wù),其他應(yīng)用程序不需要再寫這樣的服務(wù),調(diào)用已有的即可。
使用:可以定義接口并把接口暴露出來,以便其他應(yīng)用進行操作。客戶端建立到服務(wù)對象的連接,并通過那個連接來調(diào)用服務(wù)。調(diào)用Context.bindService()方法建立連接,并啟動,以調(diào)用 Context.unbindService()關(guān)閉連接。多個客戶端可以綁定至同一個服務(wù)。如果服務(wù)此時還沒有加載,bindService()會先加載它。
運行類別
1.前臺服務(wù)
前臺服務(wù)需要調(diào)用startForeground或setForeground使服務(wù)成為前臺服務(wù),使用前臺服務(wù)可以避免服務(wù)在后臺運行的時候被系統(tǒng)kill
2.后臺服務(wù)
后臺服務(wù)是處在后臺運行的。

  • 服務(wù)基本用法
    1.定義一個服務(wù)
public class MyService extends Service {
      @Ovierride
      public IBinder onBind(Intent intent) {
            return null;
      }
}

一個服務(wù)最常用到三個方法:onCreat、onStartCommand、onDestroy。onCreate會在服務(wù)創(chuàng)建的時候調(diào)用,onStartCommand方法會在每次服務(wù)啟動時候調(diào)用,onDestroy會在服務(wù)銷毀的時候調(diào)用。
2.服務(wù)需要在清單文件AndroidManfest.xml中進行注冊才能生效

  • 服務(wù)生命周期
    Service是不能自己啟動的,只能通過Context對象調(diào)用startService或者bindService方法來啟動。
    1)startService:Service會經(jīng)歷onCreate->onStart。onCreate只調(diào)用一次,onstart可能會重復調(diào)用多次。stopService:調(diào)用onDestroy。如果調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運行。該Service的調(diào)用者起來后可以再調(diào)用stopService來關(guān)閉Service。
    2)bindService:Service會經(jīng)歷onCreate->onBind,onBind將返回給客戶端一個IBind接口實例。會把調(diào)用者和Service綁定在一起,Context退出了,Service會調(diào)用onUnbind->onDestroy。不可多次綁定
    3)在Service每一次的開啟關(guān)閉過程中,只有onStart可被多次調(diào)用(通過多次startService調(diào)用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調(diào)用一次
    4)BroadcastReceiver只能通過startService啟動Service,因為廣播本身生命周期很短,bind的話沒有意義
  • 服務(wù)更多技巧
    1.服務(wù)基本在后臺運行,且優(yōu)先級低。若出現(xiàn)內(nèi)存不足情況下會回收服務(wù)。可以使用前臺服務(wù)來避免回收。前臺服務(wù)會一直有一個正在運行的圖標在系統(tǒng)狀態(tài)欄顯示下拉狀態(tài)欄可以看到更加詳細的信息,類似通知的效果
    2.使用IntentService。onHandleIntent方法里是在線程中執(zhí)行的,不用擔心耗時程序異常問題ANR。提供一個無參構(gòu)造好書,并且必須在其內(nèi)部調(diào)用父類的有參構(gòu)造函數(shù)
public class MyIntentService extents IntentService {
       public MyIntentService() {
            super("MyIntentService");
       }
       @Override
       public void onHandleIntent(Intent intent) {
       
       }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • [文章內(nèi)容來自Developers] Service是一個可以在后臺執(zhí)行長時間運行操作而不提供用戶界面的應(yīng)用組件。...
    岳小川閱讀 888評論 0 7
  • 服務(wù)基本上分為兩種形式 啟動 當應(yīng)用組件(如 Activity)通過調(diào)用 startService() 啟動服務(wù)時...
    pifoo閱讀 1,291評論 0 8
  • 本文主要搜集記錄一下Android開發(fā)的四大組件:一、Activity詳解二、Service詳解三、Broadca...
    AFinalStone閱讀 624評論 0 2
  • 適配器模式屬于接口模式的一種,什么是接口模式?通俗點講就是通過定義接口的形式來回調(diào)方法,使用不同接口的方法提供的服...
    ReturnYHH閱讀 422評論 0 1
  • 這部書講述了老子的一生經(jīng)歷,講述了老子是如何悟道的,這對我們后人理解老子的道是非常有幫助的。 一提到老子大家很多時...
    了行閱讀 194評論 0 0