//Book.Java
package com.adam.aidldemo.aidlTest;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable
{
public String title;
public int id;
public Book(int id, String title) {
this.id = id;
this.title = title;
}
public Book()
{
}
protected Book(Parcel in) {
title = in.readString();
id = in.readInt();
}
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];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(title);
parcel.writeInt(id);
}
}
Book.aidl
package com.adam.aidldemo.aidlTest;
parcelable Book;
ILibrary.aidl
// ILibrary.aidl
package com.adam.aidldemo.aidlTest;
import com.adam.aidldemo.aidlTest.Book;
import com.adam.aidldemo.aidlTest.IOnNewBookArrivedListener;
interface ILibrary {
List<Book> getBookList();
void addBook(in Book book);
void setOnNewBookArrivedListener(IOnNewBookArrivedListener listener);
void removeOnNewBookArrivedListener(IOnNewBookArrivedListener listener);
}
IOnNewBookArrivedListener.aidl 远程回调接口
// ILibrary.aidl
package com.adam.aidldemo.aidlTest;
import com.adam.aidldemo.aidlTest.Book;
import com.adam.aidldemo.aidlTest.IOnNewBookArrivedListener;
interface ILibrary {
List<Book> getBookList();
void addBook(in Book book);
void setOnNewBookArrivedListener(IOnNewBookArrivedListener listener);
void removeOnNewBookArrivedListener(IOnNewBookArrivedListener listener);
}
远程服务 LibraryService.java
package com.adam.aidldemo.aidlTest;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import java.util.ArrayList;
import java.util.List;
public class LibraryService extends Service
{
private static final String TAG="LibraryService";
private List<Book> mBookList=new ArrayList<>();
private RemoteCallbackList<IOnNewBookArrivedListener> mListenerList=new RemoteCallbackList<>();
private Binder mBinder=new ILibrary.Stub()
{
@Override
public List<Book> getBookList() throws RemoteException {
return mBookList;
}
@Override
public void addBook(Book book) throws RemoteException {
mBookList.add(book);
onNewBookArrived(book);
}
@Override
public void setOnNewBookArrivedListener(IOnNewBookArrivedListener listener) throws RemoteException {
if(listener!=null)
mListenerList.register(listener);
}
@Override
public void removeOnNewBookArrivedListener(IOnNewBookArrivedListener listener) throws RemoteException {
mListenerList.unregister(listener);
}
};
public LibraryService() {
mBookList.add(new Book(1,"android"));
mBookList.add(new Book(2,"ios"));
}
private void onNewBookArrived(Book book) throws RemoteException
{
int n=mListenerList.beginBroadcast();
for(int i=0;i<n;++i)
{
try
{
mListenerList.getBroadcastItem(i).onNewBookArrived(book);
}catch (RemoteException e)
{
e.printStackTrace();
}
}
mListenerList.finishBroadcast();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
客户端AidlActivity.java
package com.adam.aidldemo.aidlTest;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.adam.aidldemo.R;
import java.util.List;
public class AidlActivity extends AppCompatActivity
{
Context mContext=this;
Button mGetList;
Button mAddBook;
TextView mBookList_tv;
ILibrary mLibrary;
IOnNewBookArrivedListener.Stub callback=new IOnNewBookArrivedListener.Stub()
{
@Override
public void onNewBookArrived(Book book) throws RemoteException {
updateBookList();
}
};
IBinder.DeathRecipient mDeathRecipient=new IBinder.DeathRecipient()
{
@Override
public void binderDied() {
mLibrary.asBinder().unlinkToDeath(this,0);
bindLibraryService();
}
};
ServiceConnection mConnection=new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mLibrary=ILibrary.Stub.asInterface(iBinder);
try
{
iBinder.linkToDeath(mDeathRecipient,0);
mLibrary.setOnNewBookArrivedListener(callback);
}catch (RemoteException e)
{
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mLibrary=null;
}
};
private void bindLibraryService()
{
final Intent i=new Intent(mContext,LibraryService.class);
bindService(i,mConnection, Service.BIND_AUTO_CREATE);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidl);
mGetList=(Button)findViewById(R.id.getBookList);
mAddBook=(Button)findViewById(R.id.addBook);
mBookList_tv=(TextView)findViewById(R.id.bookList);
bindLibraryService();
mAddBook.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
try
{
mLibrary.addBook(new Book(12, "fuck"));
}catch (RemoteException e)
{
e.printStackTrace();
}
}
});
mGetList.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
updateBookList();
}
});
}
private void updateBookList()
{
try
{
List<Book> bookList = mLibrary.getBookList();
StringBuilder sb = new StringBuilder();
for (Book b : bookList)
{
sb.append(b.id + " :" + b.title + "\n");
}
mBookList_tv.setText(sb.toString());
}catch (RemoteException e)
{
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mConnection);
}
}