Android IPC 之 AIDL

//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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值