进程间通信(AIDL的简单使用)

进程间通信 基本类型可以使用Intent  但是如果传递对象的话 需要先将该对象 序列化。

一般将对象序列化有两种方式,

       1.是java的方式 使用Serializable,这种比较简单 直接实现Serializable接口就行啦,但是一般需要在定义一个serialVersionUID参数,通过这个参数可以更好的实现反序列化。这种方式的开销比较大,因为要使用IO操作,一般也就在存储设备或者网络传输中使用。

       2.是android的方式,使用Parcelable,这种是android的方式。这种相对复杂点。

       首先定义一个需要序列化的类,该类实现parcelable接口。 重写

/**
 * 将当前对象写入序列化结构中
 * @param dest
 * @param flags 有两种标识 1,当前对象需要作为返回值 返回 不能立即释放资源  几乎所有情况都是0
 */
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(BookId);
    dest.writeString(BookName);
}

该方法 将对象的属性写入。

/**
 * 返回当前对象的内容描述  如果含有文件描述符 返回1 否则返回0 几乎所有都是0
 * @return
 */
@Override
public int describeContents() {
    return 0;
}
protected Book(Parcel in) {
    BookId = in.readInt();
    BookName = in.readString();
}

public static final Creator<Book> CREATOR = new Creator<Book>() {
    //序列化的对象中创建原始对象
    @Override
    public Book createFromParcel(Parcel in) {
        return new Book(in);
    }

    //创建指定长度的原始对象数组
    @Override
    public Book[] newArray(int size) {
        return new Book[size];
    }
};

将对象序列化以后 创建aidl文件  首先创建一个序列化同名的aidl文件

// Book.aidl
package com.example.a11077.librarydemo.aidl;
parcelable Book;

在创建一个需要实现方法的接口 aidl文件

// IBookManager.aidl
package com.example.a11077.librarydemo.aidl;
import com.example.a11077.librarydemo.aidl.Book;
// Declare any non-default types here with import statements

interface IBookManager {
   List<Book> getBookList();
   void addBook(in Book book);
}

创建另外一个进程中的服务

public class IService extends Service {

    private ArrayList<Book> bookList;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        bookList=new ArrayList<>();
        Log.d("myadil","绑定服务!");
        return iBinder;
    }

    private IBinder iBinder=new IBookManager.Stub() {
        @Override
        public List<Book> getBookList() throws RemoteException {
            return bookList;
        }

        @Override
        public void addBook(Book book) throws RemoteException {
            Log.d("bookID",book.getBookId()+"");
            Log.d("bookName",book.getBookName()+"");
            Log.d("booksize",bookList.size()+"");
            bookList.add(book);
        }
    };
}

在另一个进程中 先绑定这个服务

Intent intent = new Intent(getActivity(), IService.class);
getActivity().bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

创建上述中的seviceConnection 

private ServiceConnection serviceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        //链接服务后返回拿到binder 转化AIDL在不同进程中会返回该代理
        iBookManager = IBookManager.Stub.asInterface(service);
    }

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

在该进程中调用服务中实现的方法 即可在服务中调用传入的 序列化对象。即在内存中传递。

Book book = new Book((int) Math.random()*10,"测试");
try {
    iBookManager.addBook(book);
} catch (RemoteException e) {
    e.printStackTrace();
}

猜你喜欢

转载自blog.csdn.net/weixin_42171638/article/details/85234910
今日推荐