#組件
* Activity
* broadcast Receiver
* Service : 服務(wù)
> windows: 長期后臺(tái)運(yùn)行沒有界面的進(jìn)程就叫服務(wù).
>
> android: 長期后臺(tái)運(yùn)行,沒有界面的組件, 服務(wù)是運(yùn)行在當(dāng)前應(yīng)用程序進(jìn)程里面
##服務(wù)的應(yīng)用場(chǎng)景
> 長期后臺(tái)運(yùn)行,沒有界面的組件.
>
> 1. 監(jiān)視一個(gè)硬件是否被插入
> 2. 連接服務(wù)器刷新最新的數(shù)據(jù).
> 3. 定時(shí)的輪詢
注意: 服務(wù)是運(yùn)行在主線程里面(main), 不可以直接在服務(wù)里面編寫耗時(shí)的邏輯.
##進(jìn)程的優(yōu)先級(jí)
* Foreground process
> 前臺(tái)進(jìn)程: 用戶正在操作的應(yīng)用程序所在的進(jìn)程就是前臺(tái)進(jìn)程
* Visible process
> 可視進(jìn)程: 用戶已經(jīng)不能操作這個(gè)應(yīng)用程序了,但是界面用戶仍然可以看到
* Service process
> 服務(wù)進(jìn)程: 應(yīng)用程序有一個(gè)服務(wù)代碼正在運(yùn)行
* Background process
> 后臺(tái)進(jìn)程: 應(yīng)用程序有界面,但是界面被用戶最小化(home)
* Empty process
> 空進(jìn)程: 應(yīng)用程序沒有任何運(yùn)行的Activity,service.
前臺(tái)進(jìn)程>可視進(jìn)程>服務(wù)進(jìn)程>后臺(tái)進(jìn)程>空進(jìn)程
##服務(wù)的生命周期
* start的方式開啟服務(wù),服務(wù)只會(huì)被創(chuàng)建一次,在創(chuàng)建的時(shí)候執(zhí)行oncreate方法,一旦服務(wù)創(chuàng)建完畢,再去開啟service就不會(huì)重復(fù)執(zhí)行oncreate方法了.只會(huì)執(zhí)行onstart和onstartcommand
* 服務(wù)停止 stopService() ondestroy() 服務(wù)只會(huì)別停止一次
* startService()
> 缺陷:? 我們不可以調(diào)用服務(wù)的方法, 不可以與服務(wù)進(jìn)行通信.
* bindService() 綁定服務(wù)
> 可以間接的調(diào)用到服務(wù)里面的方法, 可以與服務(wù)進(jìn)行通信.
##綁定服務(wù)調(diào)用服務(wù)方法的步驟
1. 編寫服務(wù)代碼
public IBinder onBind(Intent intent) {}
2. 在服務(wù)內(nèi)部定義一個(gè)代理人對(duì)象 MyBinder
代理人對(duì)象有一個(gè)方法可以間接的調(diào)用服務(wù)內(nèi)部的方法
3. 在onbind方法里面返回代理人對(duì)象
4. 在Activity代碼采用綁定的方式連接到服務(wù)
bindService(intent, new MyConn(),? BIND_AUTO_CREATE);
5. 在serviceConnection的實(shí)現(xiàn)類里面有一個(gè)方法,獲取到服務(wù)返回的代理人對(duì)象
public void onServiceConnected(ComponentName name, IBinder service)
6. 強(qiáng)制類型轉(zhuǎn)換IBinder轉(zhuǎn)化成 MyBinder類型
myBinder = (MyBinder) service;
7. 調(diào)用代理人對(duì)象的方法--間接調(diào)用了服務(wù)里面的方法.
##綁定方式開啟服務(wù)的生命周期
* 綁定的方式開啟服務(wù),如果服務(wù)不存在, oncreate--->onbind
* 服務(wù)的onstart和onstartcommand方法不會(huì)被執(zhí)行.
* 解除綁定服務(wù) onunbind()--->ondetroy()
* 多次綁定服務(wù),服務(wù)只會(huì)被創(chuàng)建一次,oncreate方法只會(huì)被執(zhí)行一次
* 多次綁定服務(wù),onbind方法不會(huì)被重復(fù)調(diào)用.
* 在實(shí)際開發(fā)的時(shí)候,如果需要調(diào)用服務(wù)的方法,就綁定服務(wù),只能綁定一次
* 服務(wù)只可以被解綁一次,如果用同一個(gè)conn對(duì)象多次解綁,服務(wù)會(huì)拋出一次.
##兩種開啟服務(wù)方式的比較
* start的方式開啟服務(wù)
> 服務(wù)一旦開啟,長期后臺(tái)運(yùn)行,服務(wù)和開啟者(Activity)沒有任何的關(guān)系,開啟者退出了,服務(wù)還是繼續(xù)在后臺(tái)長期運(yùn)行, 開啟者(Activity)不可以調(diào)用服務(wù)里面的方法. 在系統(tǒng)設(shè)置界面里面可以觀察到
* bind的方式開啟服務(wù)
> 不求同時(shí)生,但求同時(shí)死. 如果開啟者(Activity)退出了, 服務(wù)也會(huì)跟著掛掉.
> 開啟者(Activity)可以間接的利用中間人調(diào)用服務(wù)里面的方法.在系統(tǒng)設(shè)置界面看不到的.
服務(wù)如果被開啟同時(shí)被綁定,服務(wù)就停不掉了.必須解除綁定服務(wù)才可以停止服務(wù).
##混合的方式開啟服務(wù).
* 為了保證服務(wù)又能長期后臺(tái)運(yùn)行,又能調(diào)用到服務(wù)里面的方法.
* 采用混合的方式開啟服務(wù).
> 請(qǐng)嚴(yán)格按照步驟編寫代碼:
1. start的方式開啟服務(wù) (保證服務(wù)長期后臺(tái)運(yùn)行)
2. bind的方式綁定服務(wù) (調(diào)用服務(wù)的方法)
3. unbind的方式解除綁定服務(wù)
4. stop的方式停止服務(wù)
##本地服務(wù)和遠(yuǎn)程服務(wù)
* 本地服務(wù) local service
> 服務(wù)的代碼在當(dāng)前應(yīng)用程序的內(nèi)部
* 遠(yuǎn)程服務(wù) remote service
> 服務(wù)的代碼在另外一個(gè)應(yīng)用程序里面
##重要概念
* 進(jìn)程
> 操作系統(tǒng)分配的獨(dú)立的內(nèi)存空間.
* IPC
> inter process communication 進(jìn)程間通訊
* aidl
> android interface definition language 安卓接口定義語言
##綁定遠(yuǎn)程服務(wù)調(diào)用服務(wù)方法的流程
1. 跟本地服務(wù)的代碼編寫是一樣.
2. 遠(yuǎn)程服務(wù)的接口定義文件.java--->.aidl
3. 把接口定義文件的訪問修飾符全部刪除 public private
4. 原來代理人MyBinder extend Binder implemet IService--> extends IService.Stub
5. 先把遠(yuǎn)程服務(wù).aidl文件拷貝到本地應(yīng)用程序的工程目錄里面,包名一致
6. iService = IService.Stub.asInterface(service);得到遠(yuǎn)程服務(wù)的代理對(duì)象
7. 通過代理對(duì)象調(diào)用遠(yuǎn)程服務(wù)的方法.