Android AIDL 实现两个APP之间的跨进程通信实例

1 Service端创建

首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信

servier端结构如下
Server端结构

AIDL代码如下

// IBookManager.aidl
package com.example.bookserver.aidl;

// Declare any non-default types here with import statements
import com.example.bookserver.aidl.Book;
interface IBookManager {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

    List<Book> getBook();
    boolean addBook(in Book book);

}
package com.example.bookserver.aidl;

parcelable Book;

之后创建一个实现了Parcelable的Book.java类用来传递数据

package com.example.bookserver.aidl;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by SAMSUNG on 2016-09-07.
 */
public class Book implements Parcelable {
    private int id;
    private String name ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.name);
    }

    public Book() {
    }

    protected Book(Parcel in) {
        this.id = in.readInt();
        this.name = 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];
        }
    };
}

最后我们来写一个Service用于客户端绑定

package com.example.bookserver.service;

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

import com.example.bookserver.aidl.Book;
import com.example.bookserver.aidl.IBookManager;

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


public class BookService extends Service {
    private CopyOnWriteArrayList<Book> boookList = new CopyOnWriteArrayList<Book>();
    public BookService() {

    }
    Binder binder = new IBookManager.Stub(){

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public List<Book> getBook() throws RemoteException {
            return boookList;
        }

        @Override
        public boolean addBook(Book book) throws RemoteException {
            return boookList.add(book);
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
      return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Book book = new Book();
        book.setId(12345);
        book.setName("Book 1");
        boookList.add(book);
    }
}

这样Server端就搞定了,接下来就该进行Client端的代码编写了

2 Client端

Client端结构如下

Client端结构
首先我们要讲AndroidStudio 通过AIDL生成的Binder导入到Client中并将Book.java也导入到Client中
然后写进行Service的绑定

package com.example.bookclient;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.IBinder;
import android.util.Log;

import com.example.bookserver.aidl.IBookManager;

import java.util.List;

/**
 * Created by SAMSUNG on 2016-09-07.
 */
public class BookServiceManager {
    Context mContext = null;
    IBookManager mService = null;
    private static BookServiceManager bsm ;
    public static BookServiceManager getInstance(Context context){
        if(bsm==null){
            bsm = new BookServiceManager(context);
        }
        return bsm;
    }
    public IBookManager getBookServie(){
        while (mService==null){
            Log.d("BookServiceManager", "getBookServie: ");
            this.connectService();

        }
        return mService;
    }

    public BookServiceManager(Context mContext) {
        this.mContext = mContext;
    }

    ServiceConnection scc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("BookServiceManager", "getBookServie: 2 ==> Bind ");
            mService = IBookManager.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
    };
    public boolean connectService(){
        if(mService == null){
            Log.d("BookServiceManager", "getBookServie: 2");
            Intent intent = new Intent("com.example.bookserver.service.BookService");
            final Intent eintent = new Intent(createExplicitFromImplicitIntent(mContext,intent));
            mContext.bindService(eintent,scc, Service.BIND_AUTO_CREATE);
        }
        return true;
    }

    public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
        // Retrieve all services that can match the given intent
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);

        // Make sure only one match was found
        if (resolveInfo == null || resolveInfo.size() != 1) {
            return null;
        }

        // Get component info and create ComponentName
        ResolveInfo serviceInfo = resolveInfo.get(0);
        String packageName = serviceInfo.serviceInfo.packageName;
        String className = serviceInfo.serviceInfo.name;
        ComponentName component = new ComponentName(packageName, className);

        // Create a new intent. Use the old one for extras and such reuse
        Intent explicitIntent = new Intent(implicitIntent);

        // Set the component to be explicit
        explicitIntent.setComponent(component);

        return explicitIntent;
    }
}

最后对设置Button进行调用

package com.example.bookclient;

import android.os.Bundle;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.example.bookserver.aidl.Book;
import com.example.bookserver.aidl.IBookManager;

public class MainActivity extends AppCompatActivity {
    IBookManager mBookService ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        Button addButton = (Button) findViewById(R.id.button3);
        Button findButton = (Button) findViewById(R.id.button2);
        BookServiceManager.getInstance(getApplication()).connectService();
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                mBookService = BookServiceManager.getInstance(getApplication()).getBookServie();

            }
        });

        addButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setId(2345);
                book.setName("add book!!");
                try {
                    mBookService.addBook(book);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }
        });

        findButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                try {
                     Log.d("MainActivity", mBookService.getBook().toString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }
        });
    }
}

这样我们就实现了AIDL的不同APP的调用

阅读更多

没有更多推荐了,返回首页