Android中的AIDL

来源:互联网 发布:微信h5软件 编辑:程序博客网 时间:2024/05/21 07:15

1.AIDL介绍

为使应用程序之间能够彼此通信, Android提供了IPC(Inter Process Communication,进程间通信)的一种独特实现: AIDL -Android Interface Definition Language, Android接口定义语言。

2.项目结构

这里写图片描述

这里写图片描述

3.项目代码

1.新建Book类实现Parcelable —- Book.java

package com.zhoujian.android.aidl;import android.os.Parcel;import android.os.Parcelable;/** * Created by zhoujian on 2016/11/28. */public class Book implements Parcelable{    //自动生成Parcelable接口  command+n    public int bookId;    public String bookName;    @Override    public String toString()    {        return "Book{" + "bookId=" + bookId + ", bookName='" + bookName + '\'' +'}';    }    public Book(int bookId, String bookName)     {        this.bookId = bookId;        this.bookName = bookName;    }    @Override    public int describeContents()    {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags)    {        dest.writeInt(this.bookId);        dest.writeString(this.bookName);    }    protected Book(Parcel in)     {        this.bookId = in.readInt();        this.bookName = in.readString();    }    public static final Creator<Book> CREATOR = new Creator<Book>()    {        @Override        public Book createFromParcel(Parcel source)        {            return new Book(source);        }        @Override        public Book[] newArray(int size)        {            return new Book[size];        }    };}

2.创建aidl文件

Book.aidl

// Book.aidlpackage com.zhoujian.android.aidl;// Declare any non-default types here with import statementsparcelable Book;

IBookManager.aidl

// IBookManager.aidlpackage com.zhoujian.android.aidl;import com.zhoujian.android.aidl.Book;import com.zhoujian.android.aidl.IOnNewBookArriedListener;// Declare any non-default types here with import statementsinterface IBookManager{    List<Book>  getBookList();    void addBook(in Book book);    void registListener(IOnNewBookArriedListener listener);    void unregistListener(IOnNewBookArriedListener listener);}

IOnNewBookArriedListener.aidl

// IOnNewBookArriedListener.aidlpackage com.zhoujian.android.aidl;import com.zhoujian.android.aidl.Book;// Declare any non-default types here with import statementsinterface IOnNewBookArriedListener {   void onNewBookArrived(in Book newBook);}

系统会为我们自动生成对应的java类,Android studio中对应的java类位于build->generated->source->aidl->debug->项目对应的包下

IBookManager.java

/* * This file is auto-generated.  DO NOT MODIFY. * Original file: /Users/zhoujian/AndroidStudioProjects/Chapter_02/app/src/main/aidl/com/zhoujian/android/aidl/IBookManager.aidl */package com.zhoujian.android.aidl;// Declare any non-default types here with import statementspublic interface IBookManager extends android.os.IInterface {    /**     * Local-side IPC implementation stub class.     */    public static abstract class Stub extends android.os.Binder implements com.zhoujian.android.aidl.IBookManager {        private static final java.lang.String DESCRIPTOR = "com.zhoujian.android.aidl.IBookManager";        /**         * Construct the stub at attach it to the interface.         */        public Stub() {            this.attachInterface(this, DESCRIPTOR);        }        /**         * Cast an IBinder object into an com.zhoujian.android.aidl.IBookManager interface,         * generating a proxy if needed.         */        public static com.zhoujian.android.aidl.IBookManager asInterface(android.os.IBinder obj) {            if ((obj == null)) {                return null;            }            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);            if (((iin != null) && (iin instanceof com.zhoujian.android.aidl.IBookManager))) {                return ((com.zhoujian.android.aidl.IBookManager) iin);            }            return new com.zhoujian.android.aidl.IBookManager.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_getBookList: {                    data.enforceInterface(DESCRIPTOR);                    java.util.List<com.zhoujian.android.aidl.Book> _result = this.getBookList();                    reply.writeNoException();                    reply.writeTypedList(_result);                    return true;                }                case TRANSACTION_addBook: {                    data.enforceInterface(DESCRIPTOR);                    com.zhoujian.android.aidl.Book _arg0;                    if ((0 != data.readInt())) {                        _arg0 = com.zhoujian.android.aidl.Book.CREATOR.createFromParcel(data);                    } else {                        _arg0 = null;                    }                    this.addBook(_arg0);                    reply.writeNoException();                    return true;                }                case TRANSACTION_registListener: {                    data.enforceInterface(DESCRIPTOR);                    com.zhoujian.android.aidl.IOnNewBookArriedListener _arg0;                    _arg0 = com.zhoujian.android.aidl.IOnNewBookArriedListener.Stub.asInterface(data.readStrongBinder());                    this.registListener(_arg0);                    reply.writeNoException();                    return true;                }                case TRANSACTION_unregistListener: {                    data.enforceInterface(DESCRIPTOR);                    com.zhoujian.android.aidl.IOnNewBookArriedListener _arg0;                    _arg0 = com.zhoujian.android.aidl.IOnNewBookArriedListener.Stub.asInterface(data.readStrongBinder());                    this.unregistListener(_arg0);                    reply.writeNoException();                    return true;                }            }            return super.onTransact(code, data, reply, flags);        }        private static class Proxy implements com.zhoujian.android.aidl.IBookManager {            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.util.List<com.zhoujian.android.aidl.Book> getBookList() throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                java.util.List<com.zhoujian.android.aidl.Book> _result;                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);                    _reply.readException();                    _result = _reply.createTypedArrayList(com.zhoujian.android.aidl.Book.CREATOR);                } finally {                    _reply.recycle();                    _data.recycle();                }                return _result;            }            @Override            public void addBook(com.zhoujian.android.aidl.Book book) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    if ((book != null)) {                        _data.writeInt(1);                        book.writeToParcel(_data, 0);                    } else {                        _data.writeInt(0);                    }                    mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);                    _reply.readException();                } finally {                    _reply.recycle();                    _data.recycle();                }            }            @Override            public void registListener(com.zhoujian.android.aidl.IOnNewBookArriedListener listener) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null)));                    mRemote.transact(Stub.TRANSACTION_registListener, _data, _reply, 0);                    _reply.readException();                } finally {                    _reply.recycle();                    _data.recycle();                }            }            @Override            public void unregistListener(com.zhoujian.android.aidl.IOnNewBookArriedListener listener) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null)));                    mRemote.transact(Stub.TRANSACTION_unregistListener, _data, _reply, 0);                    _reply.readException();                } finally {                    _reply.recycle();                    _data.recycle();                }            }        }        static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);        static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);        static final int TRANSACTION_registListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);        static final int TRANSACTION_unregistListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);    }    public java.util.List<com.zhoujian.android.aidl.Book> getBookList() throws android.os.RemoteException;    public void addBook(com.zhoujian.android.aidl.Book book) throws android.os.RemoteException;    public void registListener(com.zhoujian.android.aidl.IOnNewBookArriedListener listener) throws android.os.RemoteException;    public void unregistListener(com.zhoujian.android.aidl.IOnNewBookArriedListener listener) throws android.os.RemoteException;}

IOnNewBookArriedListener.java

/* * This file is auto-generated.  DO NOT MODIFY. * Original file: /Users/zhoujian/AndroidStudioProjects/Chapter_02/app/src/main/aidl/com/zhoujian/android/aidl/IOnNewBookArriedListener.aidl */package com.zhoujian.android.aidl;// Declare any non-default types here with import statementspublic interface IOnNewBookArriedListener extends android.os.IInterface {    /**     * Local-side IPC implementation stub class.     */    public static abstract class Stub extends android.os.Binder implements com.zhoujian.android.aidl.IOnNewBookArriedListener {        private static final java.lang.String DESCRIPTOR = "com.zhoujian.android.aidl.IOnNewBookArriedListener";        /**         * Construct the stub at attach it to the interface.         */        public Stub() {            this.attachInterface(this, DESCRIPTOR);        }        /**         * Cast an IBinder object into an com.zhoujian.android.aidl.IOnNewBookArriedListener interface,         * generating a proxy if needed.         */        public static com.zhoujian.android.aidl.IOnNewBookArriedListener asInterface(android.os.IBinder obj) {            if ((obj == null)) {                return null;            }            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);            if (((iin != null) && (iin instanceof com.zhoujian.android.aidl.IOnNewBookArriedListener))) {                return ((com.zhoujian.android.aidl.IOnNewBookArriedListener) iin);            }            return new com.zhoujian.android.aidl.IOnNewBookArriedListener.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_onNewBookArrived: {                    data.enforceInterface(DESCRIPTOR);                    com.zhoujian.android.aidl.Book _arg0;                    if ((0 != data.readInt())) {                        _arg0 = com.zhoujian.android.aidl.Book.CREATOR.createFromParcel(data);                    } else {                        _arg0 = null;                    }                    this.onNewBookArrived(_arg0);                    reply.writeNoException();                    return true;                }            }            return super.onTransact(code, data, reply, flags);        }        private static class Proxy implements com.zhoujian.android.aidl.IOnNewBookArriedListener {            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 void onNewBookArrived(com.zhoujian.android.aidl.Book newBook) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    if ((newBook != null)) {                        _data.writeInt(1);                        newBook.writeToParcel(_data, 0);                    } else {                        _data.writeInt(0);                    }                    mRemote.transact(Stub.TRANSACTION_onNewBookArrived, _data, _reply, 0);                    _reply.readException();                } finally {                    _reply.recycle();                    _data.recycle();                }            }        }        static final int TRANSACTION_onNewBookArrived = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);    }    public void onNewBookArrived(com.zhoujian.android.aidl.Book newBook) throws android.os.RemoteException;}

创建服务端:BookManagerService

<service android:name=".aidl.BookManagerService"                android:process=":romote"/>
package com.zhoujian.android.aidl;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;import java.util.concurrent.atomic.AtomicBoolean;/** * Created by zhoujian on 2016/11/28. */public class BookManagerService extends Service{    public static  final String TAG = "BookManagerService";    private AtomicBoolean mAtomicBoolean = new AtomicBoolean(false);    //CopyOnWriteArrayList 支持并发读与写    private CopyOnWriteArrayList<Book> mBooksList = new CopyOnWriteArrayList<Book>();    private CopyOnWriteArrayList<IOnNewBookArriedListener> mListeners = new CopyOnWriteArrayList<IOnNewBookArriedListener>();    private Binder mBinder = new IBookManager.Stub()    {        @Override        public List<Book> getBookList() throws RemoteException         {            return mBooksList;        }        @Override        public void addBook(Book book) throws RemoteException        {            mBooksList.add(book);        }        @Override        public void registListener(IOnNewBookArriedListener listener) throws RemoteException         {            if (!mListeners.contains(listener))            {                mListeners.add(listener);            }            else            {                Log.d(TAG, "监听事件已存在");            }            Log.d(TAG, "监听事件的数量为:" + mListeners.size());        }        @Override        public void unregistListener(IOnNewBookArriedListener listener) throws RemoteException         {            if (mListeners.contains(listener)) {                mListeners.remove(listener);                Log.d(TAG, "解除注册成功");            }else{                Log.d(TAG, "没有发现监听事件,不能注册");            }        }    };    @Override    public void onCreate()    {        super.onCreate();        mBooksList.add(new Book(1,"离散数学"));        mBooksList.add(new Book(2,"操作系统"));        //开启线程每5秒钟向书库中添加一本新书,并通知所有感兴趣的客户        new Thread()        {            private int mInt;            @Override            public void run()            {                while (! mAtomicBoolean.get())                {                    try                    {                        Thread.sleep(3000);                    }                    catch (InterruptedException e)                    {                        e.printStackTrace();                    }                    mInt = mBooksList.size() + 1;                    Book book = new Book(mInt,"新的书籍"+mInt);                    try                    {                        onNewBookArrived(book);                    }                    catch (RemoteException e)                    {                        e.printStackTrace();                    }                }            }        }.start();    }    private void onNewBookArrived(Book book) throws RemoteException    {        mBooksList.add(book);        for (int i = 0; i < mListeners.size(); i++)        {            IOnNewBookArriedListener mListener = mListeners.get(i);            Log.d(TAG, "新书到啦");            mListener.onNewBookArrived(book);        }    }    @Override    public IBinder onBind(Intent intent)    {        return mBinder;    }    @Override    public void onDestroy()    {        mAtomicBoolean.set(true);        super.onDestroy();    }}

创建客户端 ,客户端位于默认进程中,与服务端属于不同进程,以实现进程间通信

<activity android:name=".activity.BookManagerActivity"/>
package com.zhoujian.android.activity;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.RemoteException;import android.util.Log;import android.widget.Button;import com.zhoujian.android.R;import com.zhoujian.android.aidl.Book;import com.zhoujian.android.aidl.BookManagerService;import com.zhoujian.android.aidl.IBookManager;import com.zhoujian.android.aidl.IOnNewBookArriedListener;import java.util.List;import butterknife.ButterKnife;import butterknife.InjectView;/** * Created by zhoujian on 2016/11/28. */public class BookManagerActivity extends Activity{    public static final String TAG = "BookManagerActivity";    @InjectView(R.id.bt_start)    Button mBtStart;    private IBookManager mIBookManager;    private Handler mHandler = new Handler()    {        @Override        public void handleMessage(Message msg) {            switch (msg.what)            {                case 1:                    Log.d(TAG, "添加的新书为:" + msg.obj);                    break;            }        }    };    private ServiceConnection conn = new ServiceConnection()    {        private List<Book> mList1;        private List<Book> mList;        @Override        public void onServiceConnected(ComponentName name, IBinder binder)        {            IBookManager bookManager = IBookManager.Stub.asInterface(binder);            try             {                mIBookManager= bookManager;                mList = bookManager.getBookList();                //返回的是类型   结构为:java.util.ArrayList                mList.getClass().getCanonicalName();                Log.d(TAG, "查询书籍的列表为:" + mList.toString());                //在服务端在添加一本书                Book book = new Book(3,"面向对象分析与设计");                bookManager.addBook(book);                mList1 = bookManager.getBookList();                Log.d(TAG,"查询的书籍为:==="+mList1.toString());                bookManager.registListener(mIOnNewBookArriedListener);            }            catch (Exception e)            {                e.printStackTrace();            }        }        @Override        public void onServiceDisconnected(ComponentName name)         {            mIBookManager=null;        }    };    private IOnNewBookArriedListener mIOnNewBookArriedListener = new IOnNewBookArriedListener.Stub()    {        @Override        public void onNewBookArrived(Book newBook) throws RemoteException {            mHandler.obtainMessage(1,newBook).sendToTarget();        }    };    //对生命周期方法进行排序  optioncommand+k    @Override    protected void onCreate(Bundle savedInstanceState)     {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_bookmanager);        ButterKnife.inject(this);        Intent intent = new Intent(BookManagerActivity.this, BookManagerService.class);        bindService(intent, conn, Context.BIND_AUTO_CREATE);    }    @Override    protected void onRestart() {        super.onRestart();    }    @Override    protected void onStart() {        super.onStart();    }    @Override    protected void onResume() {        super.onResume();    }    @Override    protected void onPause() {        super.onPause();    }    @Override    protected void onStop() {        super.onStop();    }    @Override    protected void onDestroy() {        if (mIBookManager != null && mIBookManager.asBinder().isBinderAlive()) {            try {                mIBookManager.unregistListener(mIOnNewBookArriedListener);            } catch (RemoteException e) {                e.printStackTrace();            }        }        unbindService(conn);        super.onDestroy();    }}

最终运行结果为:

这里写图片描述

下载地址

0 0
原创粉丝点击