Android源碼(9) --- Binder(3) AIDL使用

要想了解Binder的原理,結(jié)合使用方便我們更簡單的去理解調(diào)用邏輯。AIDL :Android Interface definition language 我們可以理解為Android 接口定義語言。通過它可以實現(xiàn)進程間的通訊(IPC),如何實現(xiàn)AIDL呢? 進程間通訊需要兩個進場,體現(xiàn)在Android中就需要兩個App(一個作為Server,一個作為Client).接下來看如何使用AIDL來進行進程間通訊.

Server

  • 1.新建工程:包名 com.jfson.aidlserver
  • 2.新建model類,實現(xiàn)Parcelable序列化,便于后續(xù)在AIDL中進行傳遞。
public class User implements Parcelable {
    public String name;
    public int id;

    public User(String name, int id) {
        this.name = name;
        this.id = id;
    }

    /**
     * 序列化
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(id);
    }

    @Override
    public int describeContents() {
        // 大都返回0即可
        return 0;
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    /**
     * 反序列化得到的 Parcel 構(gòu)造對象
     */
    protected User(Parcel parcel) {
        name = parcel.readString();
        id = parcel.readInt();
    }
}
  • 3.新建AIDL文件User.aidl,并引入User類
// User.aidl
package com.jfson.aidlserver;

parcelable User;
  • 4.在包名目錄下新建AIDL文件IMyAidlService.aidl,其實是個接口,主動實現(xiàn)了一個方法 void basicTypes()。在添加一個我們需要的方法 String giveMessage()。
    • 注意:這里需要導(dǎo)入User類的包名。
    • 方法參數(shù)中,除了基本數(shù)據(jù)類型外都需要標(biāo)上類型 :in(輸入), out(輸出), inout(輸入輸出)
package com.jfson.aidlserver;

// Declare any non-default types here with import statements
import com.jfson.aidlserver.User;

interface IMyAidlService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

    User giveMessage(in User user);
}

  • 3.新建 Service 并在OnBinder中返回 Aidl接口的實現(xiàn)類。在實現(xiàn)giveMessage方法中,返回你想提供給Client app的信息即可。
public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        // 返回 service接口的實例
        return new MyServiceImpl();
    }

    public class MyServiceImpl extends IMyAidlService.Stub {


        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public User giveMessage(User user) throws RemoteException {
            if (user != null){
                user.name += " is niubility!";
            }
            return user;
        }
    }
}
  • 3.1 清單文件注冊Service
 <service
            android:name="com.jfson.aidlserver.MyService"
            android:enabled="true"
            android:exported="true">

            <intent-filter>
                <action android:name="com.jfson.aidlserver.IMyAidlService"/>
            </intent-filter>
        </service>

    </application>

  • 4.到此時,作為Server的App 已經(jīng)編寫完畢,編譯后會生成java代碼。目錄在:app/build/generated/source/aidl/debug/com.jfson.aidlserver/IMyAidlService。

    生成的代碼需要提供給Client App使用的。稍后再分析生成的代碼。

Client

1.新建工程: 包名 com.jfson.aidltest
2.將Server端自動生成AIDL的java代碼和User.java拷過來,并保持目錄一致(com.jfson.aidlserver/IMyAidlService)。

3.綁定服務(wù)

public class MainActivity extends AppCompatActivity {
    private Button button;
    private IMyAidlService myService;

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 獲取服務(wù)對象
            myService = IMyAidlService.Stub.asInterface(service);
            Toast.makeText(getBaseContext(), "onServiceConnected", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myService = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if (myService == null) {
                        // onServiceConnected 回調(diào)完成后才能得到接口
                        return;
                    }
                    User user = myService.giveMessage(new User("Android", 110));
                    if (user != null) {
                        Toast.makeText(getBaseContext(), user.name, Toast.LENGTH_LONG).show();
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });

        Intent intent = new Intent();
        // 目標(biāo)Service action
        intent.setAction("com.jfson.aidlserver.IMyAidlService");
        // 5.0以上,需要指定包名
        intent.setPackage("com.jfson.aidlserver");// the service package
        // 綁定服務(wù),可設(shè)置或觸發(fā)一些特定的事件
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

}

總結(jié)

image
image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Jianwei's blog 首頁 分類 關(guān)于 歸檔 標(biāo)簽 巧用Android多進程,微信,微博等主流App都在用...
    justCode_閱讀 6,117評論 1 23
  • -- 作者 謝恩銘 轉(zhuǎn)載請注明出處 前言 為使應(yīng)用程序之間能夠彼此通信,Android提供了IPC (Inter ...
    程序員聯(lián)盟閱讀 11,687評論 6 43
  • 轉(zhuǎn)自 | 快搜搜應(yīng)屆生求職網(wǎng) 這些年參與過不少面試,也面試過別人不少次。我參與的面試,基本都能拿到offer,印象...
    陳白白白閱讀 1,107評論 0 4

友情鏈接更多精彩內(nèi)容