Android四大組件之Service

Service是一個android的四大組件之一,它沒有UI界面,可以在後臺執行長時間的操作。其他的組件可以start一個Service,service啓動以後會在後臺持續運行,不管用戶是否切換到了其他的應用程序。此外,其他的組件還可以綁定到service上,並和service做交互,甚至還可以執行跨進程的操作(IPC)。比如說,Service可以在後臺處理網絡請求、播放音樂,執行文件i/o或者跟content provider交互。

Service

定義:後臺運行,不可見,沒有界面,優先級高於activity
用途:播放音樂,記錄地理信息位置的改變,監聽某種動作
注意:運行在主線程,不能用它來做耗時的請求或動作
一般service不會被系統幹掉,就算被幹掉了也會自啓

注意:
運行在主線程,不能用它來做耗時的操作。可以在service中開闢一個線程來做耗時操作(handler,synctask)

分類
本地服務(Log Service)應用於:

1、應用程序內部
2、startService stopService stopSelf 

遠程服務應用於:

1、Android系統內部的應用程序之間
2、定義IBinder接口

數據的操作都要通過定義IBinder接口來實現

Service的生命週期
這裏寫圖片描述
Service的啓動和生命週期

1. 左邊是通過startService()開啓service,右邊是通過bindService()

2. 左邊

(1)onStartCommand()之後service就會運行,可以通過啓動源調用stopService()來停止service
(2)stopService的調用會調用onDestroy()

3. 右邊

(1)bindService()會自動調用onCreate()
(2)可以通過unbindService()來unbind這個service,然後onUnbind()會自動被調用
Service兩種啓動方式的特點:

start方式的特點:

(1)服務跟啓動源沒有任何的聯繫
(2)無法獲得服務對象

Bind方式的特點:

(1)通過IBinder接口實例,返回一個ServiceConnection對象的啓動源
(2)通過ServiceConnection對象的相關的方法可以得到Service對象

有兩種形式的service:
Started

當其他的組件通過調用startService()啓動的service是“Started”。一旦啓動以後,service就在後臺無限的運行下去,就算是啓動他的組件已經被銷燬了。通常來說,Started service只會做單一的操作,並且不會返回給調用者返回值。比如:它可以通過網絡下載或者是上傳文件。當操作結束的時候,service要手動把自己停止掉。

Bound

當其他組件通過調用bindService()綁定到service的時候,service就是 "bound"的。bound service提供了客戶端/服務端的接口,允許組件和service進行交互,發送請求,獲取結果,甚至是做跨進程的操作。bound service只存活於其他組件綁定在它上面的時候,多個組件可以同時綁定到一個service,但是,當所有的組件同時解綁以後,service就被銷燬了。

儘管本文檔是分開討論這兩種類型的service的,但是你的service可以同時支持這兩種類型,service可以是started(無限運行)同時還允許綁定。這僅僅取決於你是否實現了下面的回調:onStartCommand()允許其他的組件start一個service,onBind()允許綁定service。

不管你的service是started還是bound,應用的其他組件都可以使用這個service(甚至是別的應用)。就如同別的組件都可以使用一個Activity一樣,通過Intent來啓動它。但是,你也可以在manifest文件中把service聲明成應用私有的,這就阻止了別的應用訪問它。

服務的兩種啓動方式:

1.通過startService(Intent intent)啓動,stopService(Intent intent)停止,比較簡單。服務啓動後與啓動源無關,也無返回服務本身。需注意要在配置文件中註冊服務。
2.通過bindService(Intent intent,ServiceConnection conn,int flags)綁定服務啓動,unbindService(ServiceConnection conn)去綁定停止,該方式可以返回服務本身,與啓動源相關。

具體步驟:

Intent intent = new Intent(上下文, 目標服務名.class);
bindService(intent, conn, Service.BIND_AUTO_CREATE);//綁定

2)在自定義的服務類中通過自定義一個內部類:

public class MyBinder extends Binder {
public MyBindService getService() {
return MyBindService.this;// 獲取服務
}
}//來返回服務本身
//同時在自定義服務類重新父類Service的方法:
public IBinder onBind(Intent intent) {
return new MyBinder();
}
//該方法可返回服務本身.
//初始化ServiceConnection接口,在接口方法中重寫方法
public void onServiceConnected(ComponentName name, IBinder service) {
myBindService = ((MyBinder)service).getService();//大類轉化爲自身的小類,獲取內部類中的方法,從而獲得服務本身
}

4)在自定義的繼承於Servic類的類中,添加需要的方法,在啓動Service的Activity中可以直接調用服務中的方法。

好了,希望能幫到大家~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章