服務的生命周期:
一、采用start的方式開啟服務
生命周期如下:
onStart()過時了
開啟服務: onCreate()--> onStartCommand() ---> onDestory();
如果服務已經開啟,不會重複的執行onCreate(), 而是會調用onStart()和 onStartCommand();
服務停止的時候 onDestory().
服務隻會被停止一次
二、服務還有一種開啟方式,綁定的方式開啟服務。
onCreate() --->onBind();--->onunbind()-->onDestory();
綁定服務不會調用onstart或者onstartcommand方法;
混合調用的服務的生命周期:
服務長期背景運作,又想調用服務的方法:
1.start方式開啟服務(保證服務長期背景運作)
2.bind方式綁定服務(保證調用服務的方法)
3.unbind解除綁定服務
4.stopService停止服務。
三、兩種開啟服務方法的差別。
start方式開啟服務。 一旦服務開啟跟調用者(開啟者)就沒有任何關系了。
開啟者退出了,開啟者挂了,服務還在背景長期的運作。
開啟者沒有辦法去調用服務裡面的方法。(美國的司法獨立)
bind的方式開啟服務,綁定服務,調用者挂了,服務也會跟着挂掉。不求同時生,但求同時死。
開啟者可以調用服務裡面的方法。
遠端服務:調用者和服務在不同的工程代碼裡面。
本地服務:調用者和服務在同一個工程代碼裡面。
每一個應用程式都是運作在自己獨立的程序裡面的。
程序作業系統配置設定記憶體空間的一個機關。程序的資料都是獨立的。獨立的記憶體空間。
aidl:android interface definition language 安卓接口定義語言
aidl檔案都是公有的,沒有通路權限修飾符
IPC: inter process communication 程序間通訊
綁定本地服務調用方法的步驟:
1.在服務的内部建立一個内部類 提供一個方法,可以間接調用服務的方法
private class MiddlePerson extends Binder implements IMiddlePerson{}
2.實作服務的onbind方法,傳回的就是中間人 MiddlePerson
3.在activity 綁定服務。bindService();
4.在服務成功綁定的時候 會執行一個方法 onServiceConnected 傳遞過來一個 IBinder對象
5.強制類型轉化 調用接口裡面的方法。
綁定遠端服務調用方法的步驟:
1.在服務的内部建立一個内部類 提供一個方法,可以間接調用服務的方法
2.把暴露的接口檔案的擴充名改為aidl檔案 去掉通路修飾符 public
private class MiddlePerson extends IMiddlePerson.Stub{} IPC的子類
3.實作服務的onbind方法,傳回的就是中間人 IMiddlePerson
4.在activity 綁定服務。bindService();
5.在服務成功綁定的時候 會執行一個方法 onServiceConnected 傳遞過來一個 IBinder對象
6.IMiddlePerson.Stub.asInterface(binder) 調用接口裡面的方法。