Android IPC 机制【3】--AIDL[1]

  1. 声明接口  IBookManager.aidl

package com.shieh.android.ipctest.aidl;

import com.shieh.android.ipctest.aidl.Book;

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

2.在aidl中声明Book类,Book.aidl

package com.shieh.android.ipctest.aidl;

parcelable Book;

3.服务端实现 BookManagerService.java

package com.shieh.android.ipctest.service;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import com.shieh.android.ipctest.aidl.Book;
import com.shieh.android.ipctest.aidl.IBookManager;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;

public class BookManagerService extends Service{

    private CopyOnWriteArrayList<Book> mBookList 
            =new CopyOnWriteArrayList<Book>(); 
    
    @Override
    public void onCreate() {
        super.onCreate();
       mBookList.add(new Book(1, "Book1"));
       mBookList.add(new Book(2, "Book2"));
       mBookList.add(new Book(3, "Book3"));
        
    }

    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);
        }
    };
    
    @Override
    public IBinder onBind(Intent intent) {

        return mBinder;
    }

}

4.客户端实现 MainActivity.java

package com.shieh.android.ipctest;

import java.util.List;

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.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.shieh.android.ipctest.aidl.Book;
import com.shieh.android.ipctest.aidl.IBookManager;
import com.shieh.android.ipctest.service.BookManagerService;

public class MainActivity extends Activity {
    
    private static final String TAG = "MainActivity";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, BookManagerService.class);
        bindService(intent , mConnection , Context.BIND_AUTO_CREATE);
    }
    
    private ServiceConnection mConnection = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
            
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

          //绑定成功后将服务端返回的Binder转换为AIDL接口
          //然后通过该接口去调用服务端的方法
           IBookManager bookManager = IBookManager.Stub.asInterface(service);
           
           try{
               List<Book> list = bookManager.getBookList();
               Log.i(TAG,"get book list , type : " + list.getClass().getCanonicalName());
               Log.i(TAG,"get book list , list : " + list.toString());
               Book newBook = new Book(4,"Book4");
               Log.i(TAG,"add book:" + newBook);
               List<Book> newList = bookManager.getBookList();
               Log.i(TAG,"get book list , newlist : " + newList.toString());
           }catch (RemoteException e){
               e.printStackTrace();
           }
        }
    };

    @Override
    protected void onDestroy() {
        unbindService(mConnection);
        super.onDestroy();
    }
}


你可能感兴趣的:(Android IPC 机制【3】--AIDL[1])