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
- Android 中的AIDL
- Android 中的AIDL
- Android 中的AIDL
- Android 中的AIDL!!!
- 22. Android中的AIDL
- Android 中的AIDL
- Android 中的AIDL
- android中的AIDL
- Android中的AIDL
- Android中的AIDL
- android中的AIDL
- Android studio中的aidl
- AIDL --- Android中的远程接口
- AIDL --- Android中的远程接口
- AIDL --- Android中的远程接口
- AIDL --- Android中的远程接口
- AIDL --- Android中的远程接口
- AIDL --- Android中的远程接口
- Eclipse经常卡死的解决办法
- xcode8 libpng error: CgBI: unhandled critical chunk
- js组织架构图
- Java异常体系及异常处理
- Python下使用subprocess中文乱码的解决方案
- Android中的AIDL
- recycleview条目的背景选择器
- python中的yield简单使用
- bootbox
- Swift3.0中文教程:1.基础部分
- Android之动画效果编程基础
- 自定义隐式转换 public static implicit operator 和显式转换
- Android 过度绘制优化措施
- JDK1.5新特性4-静态导入