天天看點

Day10 遠端服務與本地服務

服務的生命周期:

一、采用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) 調用接口裡面的方法。

繼續閱讀