Service,服務,是一種需要長期後臺運行的進程,例如,數據的更新,定時的輪詢,監視硬件的插入等
一、簡介
Service是一種中生命週期比較長的組件,沒有界面不與用戶交互;長期運行在後臺執行與界面無關
的操作;與Thread類似,但是使用線程不安全;最重要的一點是Service也是運行在主線程的,不能做耗
時的操作
二、詳解
1.首先了解一下Android中的線程知識
線程由高到低爲:前臺-可視-服務-後臺-空進程
線程的回收是從低到高的,當內存不足時,會先從空進程開始從低到高回收;服務的級別是比較高的
一般情況下不會被回收,一旦被回收,那麼在內存充足時,系統會自動啓動被回收掉的服務
2.如何使用
創建類繼承Service,並且在清單文件中配置service節點
開啓服務
3.生命週期
Started Service標準模式開啓
其他組件調用startService方法開啓,這種Service可以無限制運行下去,除非調用stopSelf方
法或者其他組件調用stopService方法,但是隻能被停止一次
BoundService綁定服務
調用者用bindService方法綁定服務,調用者通過一個IBinder接口和service通信,調用者也可
用unBindService方法解除綁定;一個Service也可和多個用戶進行綁定,所有用戶解除綁定後纔會
銷燬service
bindService(service, serviceConnection, BIND_AUTO_CREATE);
一旦綁定成功後,服務內部的onBind方法執行,並且只執行一次,再次綁定不執行
serviceConnection參數:ServiceConnection的對象,要重寫onServiceConnected,綁
定成功後執行此方法,方法中的IBinder接收onBind返回的數據
BIND_AUTO_CREATE:如果綁定的服務不存在那麼創建出來
混合模式
先用startService方式開啓,然後綁定服務,這時,單純的stopService和stopSelf方法關閉
不了服務,除非所有用戶都解綁纔可以關閉
使用混合模式要嚴格遵守以下步驟
start()開啓服務
bind()綁定服務
unbind()解除綁定
stop方式停止服務
4.兩種開啓方式區別
不同一
start()開啓後服務與開啓者無任何關係,調用者退出後,service也會繼續執行
bindService()開啓後,調用者退出service也會退出(非正常退出),可以在onDestory中解除綁定
不同二
bingService開啓服務後可以調用service中的方法,而start不能
5.綁定服務步驟
編寫服務代碼
public IBinder onBind(Intent intent){}
服務內部定義代理人對象MyBinder
代理人對象中有一個方法可以調用服務內部的方法
onBind方法中返回代理人對象
在activity中採用綁定服務的方法
bindService(service, serviceConnection, BIND_AUTO_CREATE);
ServiceConnection中一個實現類獲取返回的代理人MyBinder對象
public void onServiceConnected(ComponentName name,IBinder service){}
強制類型轉換IBinder爲MyBinder
mybinder=(MyBinder)service
通過mybinder調用服務中的方法
6.服務分類
本地服務:服務在當前應用程序內部
遠程服務:服務在其他應用程序
綁定遠程服務方法
a.代碼編寫與綁定本地服務一樣
b.遠程服務的接口定義文件.java-->.aidl
c.接口定義文件中的訪問修飾符全刪掉public private
d.原來代理人MyBinder extends Binder implements Iservice --->extends IService.Stub
e.把遠程服務的aidl文件拷在本地,目錄名要一致
f.iservice = IService.Stub.asInterface(service)得到遠程服務對象
g.調用遠程服務中方法
三、小結
學的東西很多,短時間內不能很好的理解,動手寫博客的時候無從下手,看着筆記一點一點的回憶,
開始做項目,用的也是一些基本的service知識
預習--總結--複習--回顧