欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Android IPC機制之Binder的工作機制

 更新時間:2021年06月08日 09:23:19   作者:handsome黃  
IPC機制即為跨進程通信,是inter-Process Communication的縮寫。是指兩個進程之間進行通信。在說進程通信之前,我們的弄明白什么是線程,什么是進程。進程和線程是兩個截然不同的概念。本文將介紹Android IPC機制之Binder的工作機制。

進程和線程的關(guān)系

按照操作系統(tǒng)中的描述,線程是CPU調(diào)度的最小單位,同時線程也是一種有限的系統(tǒng)資源。而進程一般是指一個執(zhí)行單元,在pc端或者移動端上是指一個程序或者一個應(yīng)用。一個進程中可以包含一個或者是多個線程。所以他們的關(guān)系應(yīng)該是包含和被包含的關(guān)系。

跨進程的種類

在Android中跨進程通信的方式有很多種,Bundle,文件共享,AIDL,Messenger,ContentProvider,Socket,這些都能實現(xiàn)進程間之間的通信,當然,雖然都能夠?qū)崿F(xiàn)進程間通信,但是他們之間的實現(xiàn)原理或者說是底層的實現(xiàn)方式都是不一樣的。下面,我們將會一一說明。

注:很多同學覺得創(chuàng)建進程就應(yīng)該創(chuàng)建一個新的應(yīng)用。其實不是的。只要我們在AndroidMenifest上加上這一句代碼就可以了android:process=“:remote”具體的,同學們可以自己的了解。

在說IPC之前,先說一下一些基礎(chǔ)概念,這樣對后面的內(nèi)容能夠更好的理解。

Serializable,Parcelable接口

Serializable接口是java提供的一個序列化的接口,這是一個空的接口,為對象提供標準的序列化和反序列化操作。

Serializable序列化和反序列化,都是采ObjectOutputStream和ObjectInputStream就可以實現(xiàn),當然這些系統(tǒng)基本已經(jīng)為我們實現(xiàn)了。

Parcelable接口,是Android自帶的一種序列化方式。序列化和反序列化都是通過writeToParcel方法來完成的。

兩者的區(qū)別:Serializable是java的序列化接口使用簡單,但是由于序列化和反序列化的過程需要大量的I/o操作,所以性能較差。Parcelable接口使用較為麻煩,但是效率很高,但是存在一個很大的缺點,就是被Parcelable將對象序列化以后,要將對象保存到磁盤中的,將會很麻煩。所以建議是使用Serializable。

Binder

直觀來說,Binder是Android中的一個類,它實現(xiàn)了IBinder接口,從IPC的角度來說,Binder是Android中的一種跨進程通信的一種方式,同時還可以理解為是一種虛擬的物理設(shè)備,它的設(shè)備驅(qū)動是/dev/binder/。從Framework角度來說,Binder是ServiceManager的橋梁。從應(yīng)用層來說,Binder是客戶端和服務(wù)端進行通信的媒介。

在Android開發(fā)中,Binder主要用在Service中,包括AIDL和Messenger,由于Messenger的底層其實就是Aidl,所以現(xiàn)在我們以AIDL來分析一下binder的工作機制。

上代碼:

/*

 * This file is auto-generated.  DO NOT MODIFY.

 * Original file: /Users/huangjialin/MyApplication/service/src/main/aidl/aidl/MyAIDLService.aidl

 */

package aidl;

// Declare any non-default types here with import statements


public interface MyAIDLService extends android.os.IInterface {



    /**

     * Local-side IPC implementation stub class.

     */

    public static abstract class Stub extends android.os.Binder implements aidl.MyAIDLService {

        private static final java.lang.String DESCRIPTOR = "aidl.MyAIDLService";



        /**

         * Construct the stub at attach it to the interface.

         */

        public Stub() {

            this.attachInterface(this, DESCRIPTOR);

        }



        /**

         * Cast an IBinder object into an aidl.MyAIDLService interface,

         * generating a proxy if needed.

         */

        public static aidl.MyAIDLService asInterface(android.os.IBinder obj) {

            if ((obj == null)) {

                return null;

            }

            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);

            if (((iin != null) && (iin instanceof aidl.MyAIDLService))) {

                return ((aidl.MyAIDLService) iin);

            }

            return new aidl.MyAIDLService.Stub.Proxy(obj);

        }



        @Override

        public android.os.IBinder asBinder() {

            return this;

        }


        @Override

        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {

            switch (code) {

                case INTERFACE_TRANSACTION: {

                    reply.writeString(DESCRIPTOR);

                    return true;

                }

                case TRANSACTION_getString: {

                    data.enforceInterface(DESCRIPTOR);

                    java.lang.String _result = this.getString();

                    reply.writeNoException();

                    reply.writeString(_result);

                    return true;

                }

            }

            return super.onTransact(code, data, reply, flags);

        }



        private static class Proxy implements aidl.MyAIDLService {

            private android.os.IBinder mRemote;



            Proxy(android.os.IBinder remote) {

                mRemote = remote;

            }



            @Override

            public android.os.IBinder asBinder() {

                return mRemote;

            }



            public java.lang.String getInterfaceDescriptor() {

                return DESCRIPTOR;

            }




            @Override

            public java.lang.String getString() throws android.os.RemoteException {

                android.os.Parcel _data = android.os.Parcel.obtain();

                android.os.Parcel _reply = android.os.Parcel.obtain();

                java.lang.String _result;

                try {

                    _data.writeInterfaceToken(DESCRIPTOR);

                    mRemote.transact(Stub.TRANSACTION_getString, _data, _reply, 0);

                    _reply.readException();

                    _result = _reply.readString();

                } finally {

                    _reply.recycle();

                    _data.recycle();

                }

                return _result;

            }

        }



        static final int TRANSACTION_getString = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);

    }



    public java.lang.String getString() throws android.os.RemoteException;

}

上面這段代碼是系統(tǒng)生成的,在gen目錄下可以看到根據(jù)MyAIDLService.aidl系統(tǒng)為我們生成了MyAIDLService.java這個類。我們先來了解一下這個類中每個方法的含義:

DESCRIPTOR:Binder的唯一標識,一般用于當前Binder的類名表示。

asInterface(android.os.IBinder obj):用于將服務(wù)端的Binder對象轉(zhuǎn)換成客戶端所需的AIDL接口類型的對象,這種轉(zhuǎn)化過程是區(qū)分進程的,如果客戶端和服務(wù)端位于同一個進程,那么這個方法返回的是服務(wù)端的stub對象本身,否則返回的是系統(tǒng)封裝后的Stub.proxy對象。

asBinder():用于返回當前Binder對象。

onTransact:該方法運行在服務(wù)端的Binder線程池中,當客戶端發(fā)起跨進程通信請求的時候,遠程請求通過系統(tǒng)底層封裝后交給該方法處理。注意這個方法public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags),服務(wù)端通過code可以確定客戶端所請求的目標方法是什么,接著從data中取出目標方法所需的參數(shù),然后執(zhí)行目標方法。當目標方法執(zhí)行完畢后,就像reply中寫入返回值。這個方法的執(zhí)行過程就是這樣的。如果這個方法返回false,客戶端是會請求失敗的,所以我們可以在這個方法中做一些安全驗證。

public java.lang.String getString() throws android.os.RemoteException:

這個方法運行在客戶端中,當客戶端調(diào)用此方法的時候,它的內(nèi)部實現(xiàn)是這樣的:首先創(chuàng)建該方法所需要的輸入類型Parcel對象_data,然后調(diào)用transact方法發(fā)起遠程調(diào)用請求,同時當前線程掛起,然后服務(wù)端的OnTransact方法會被調(diào)用,直到RPC過程返回后,當前線程繼續(xù)執(zhí)行,并從_reply中讀取返回的數(shù)據(jù)。

如圖:Binder的工作機制

從上面分析,我們明白了Binder的工作機制但是要注意一些問題:

1.當客戶端發(fā)起請求時,由于當前線程會被掛起,直到服務(wù)端返回數(shù)據(jù),如果這個遠程方法很耗時的話,那么是不能夠在UI線程,也就是主線程中發(fā)起這個遠程請求的。

2.由于Service的Binder方法運行在線程池中,所以Binder方法不管是耗時還是不耗時都應(yīng)該采用同步的方式,因為它已經(jīng)運行在一個線程中了。

以上就是淺談Android IPC機制之Binder的工作機制的詳細內(nèi)容,更多關(guān)于Android IPC機制之Binder的工作機制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android通過Java sdk的方式接入OpenCv的方法

    Android通過Java sdk的方式接入OpenCv的方法

    這篇文章主要介紹了Android通過Java sdk的方式接入OpenCv的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • android 實現(xiàn)按鈕浮動在鍵盤上方的實例代碼

    android 實現(xiàn)按鈕浮動在鍵盤上方的實例代碼

    這篇文章主要介紹了android 實現(xiàn)按鈕浮動在鍵盤上方,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android編程實現(xiàn)圖片透明的方法

    Android編程實現(xiàn)圖片透明的方法

    這篇文章主要介紹了Android編程實現(xiàn)圖片透明的方法,涉及Android針對圖片布局及屬性相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Android連接服務(wù)器端的Socket的實例代碼

    Android連接服務(wù)器端的Socket的實例代碼

    這篇文章主要介紹了Android連接服務(wù)器端的Socket的實例代碼,需要的朋友可以參考下
    2017-05-05
  • Android開發(fā)使用Drawable繪制圓角與圓形圖案功能示例

    Android開發(fā)使用Drawable繪制圓角與圓形圖案功能示例

    這篇文章主要介紹了Android開發(fā)使用Drawable繪制圓角與圓形圖案功能,結(jié)合具體實例形式分析了Drawable繪制圓角矩形的實現(xiàn)步驟與使用方法,需要的朋友可以參考下
    2017-10-10
  • android針對json數(shù)據(jù)解析方法實例分析

    android針對json數(shù)據(jù)解析方法實例分析

    這篇文章主要介紹了android針對json數(shù)據(jù)解析方法,以實例形式較為詳細的分析了Android操作json格式數(shù)據(jù)的各種常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android kotlin+協(xié)程+Room數(shù)據(jù)庫的簡單使用

    Android kotlin+協(xié)程+Room數(shù)據(jù)庫的簡單使用

    這篇文章主要介紹了Android kotlin+協(xié)程+Room數(shù)據(jù)庫的簡單使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 替換so文件來動態(tài)替換Flutter代碼實現(xiàn)詳解

    替換so文件來動態(tài)替換Flutter代碼實現(xiàn)詳解

    這篇文章主要為大家介紹了替換so文件來動態(tài)替換Flutter代碼實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 一文詳解無痕埋點在Android中的實現(xiàn)

    一文詳解無痕埋點在Android中的實現(xiàn)

    很多時候因為產(chǎn)品都會要獲取用戶的行為,需要客戶端進行相關(guān)的埋點,下面這篇文章主要給大家介紹了關(guān)于無痕埋點在Android中實現(xiàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Android觀察者模式實例分析

    Android觀察者模式實例分析

    這篇文章主要介紹了Android觀察者模式,實例分析了Android觀察者模式的原理與相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04

最新評論