IPC机制之AIDL传递Parcelable
2017-07-05 17:47
197 查看
导语
IPC机制之AIDL传递基础类型数据之前文章大概简单介绍了下AIDL的部分知识,详细内容大家可以自行学习,文章很多。
因为传递基础数据类型和传递Parcelable类型还是有部分差距,所以我单独写一篇文章介绍,文章后面附有代码。
如果AIDL文件中用到了自定义的Parcelable对象,那么必须新建一个和它同名的AIDL文件,并在其中声明他的Parcelable类型。
、AIDL中除了基本数据类型,其他类型的参数必须标上方向:in、out或inout,in表示输入型参数,out表示输出型参数,inout表示输入输出型参数,具体区别请自行查找。不能一概使用out或者inout,因为这在底层实现是有开销的。
AIDL接口只支持方法,不支持声明静态常量,这一点区别于传统接口。
以上出自《Android开发艺术探索》
这篇文章是根据任玉刚的《Android开发艺术探索》中的AIDL 例子写的,具体涉及到AIDL的知识这里不深究,书上和网上都有很多讲解,这里仅仅写一个Demo来实现通过AIDL来完成多进程的通信。
Server#Book.aidl
package com.aidd.sample; parcelable Book;
Server#IBookManager.aidl
package com.aidd.sample; import com.aidd.sample.Book; interface IBookManager { List<Book> getBookList(); void addBook(in Book book); }
Server#Book.java
package com.aidd.sample; import android.os.Parcel; import android.os.Parcelable; public class Book implements Parcelable { public int bookId; public String 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 Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() { @Override public Book createFromParcel(Parcel source) { return new Book(source); } @Override public Book[] newArray(int size) { return new Book[size]; } }; }
Server#BookManagerService.java
package com.aidd.sample; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class BookManagerService extends Service { @Override public void onCreate() { super.onCreate(); mBookList.add(new Book(1, "Android")); mBookList.add(new Book(2, "iOS")); } private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<>(); private Binder mBinder = new IBookManager.Stub() { @Override public List<Book> getBookList() throws RemoteException { return mBookList; } @Override public void addBook(Book book) throws RemoteException { mBookList.add(book); } }; @Nullable @Override public IBinder onBind(Intent intent) { return mBinder; } }
Client#MainActivity.java
package sample.aidl.com.client; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.aidd.sample.Book; import com.aidd.sample.IBookManager; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startIPC(View view) { Intent intent = new Intent(); intent.setComponent(new ComponentName("com.aidd.sample", "com.aidd.sample.BookManagerService")); this.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IBookManager iBookManager = IBookManager.Stub.asInterface(service); try { List<Book> bookList = iBookManager.getBookList(); Log.i("info", "列表类型" + bookList.getClass().getCanonicalName()); Log.i("info", "数据查询结果" + bookList.toString()); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onDestroy() { unbindService(mConnection); super.onDestroy(); } }
源码下载
相关文章推荐
- IPC机制之AIDL传递基础类型数据
- Android IPC机制之AIDL
- AIDL/IPC Android AIDL/IPC 进程通信机制——超详细讲解及用法案例剖析(播放器)
- Android中RemoteService的使用详解(Aidl、IPC机制)
- android IPC AIDL传递实体类
- Android进程间通信(IPC)的AIDL机制:Hello World示例
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- AIDL 定向tag IPC Parcelable【综合案例】
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- Android的IPC机制(一)——AIDL的使用
- IPC机制——AIDL——Binder“连接池”
- Android的IPC机制(二)——AIDL实现原理简析
- 5.IPC 机制(三) IPC基础概念介绍 Parcelable接口
- IPC机制之二:Serialzable、Parcelable和Binder
- Android的IPC机制(二)——AIDL实现原理简析
- IPC机制(AIDL)
- Android IPC机制之AIDL的使用
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- Android Binder机制的Native应用&&Android系统RPC与Binder && Android Service学习之AIDL, Parcelable和远程服务
- Android 中新的数据传递机制:Parcelable(资料收集)