1 Service端创建

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

servier端结构如下

AIDL代码如下

// IBookManager.aidlpackage com.example.bookserver.aidl;// Declare any non-default types here with import statementsimport 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 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 CREATOR = new Parcelable.Creator() {        @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 boookList = new CopyOnWriteArrayList();    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 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端结构如下


首先我们要讲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 = 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的调用

更多相关文章

  1. 利用drozer进行Android渗透测试 - AndroSecurity
  2. Android(安卓)UnitTest
  3. android.uid.system无法读取SD卡信息
  4. android NDK学习篇3之two-libs——使用(多个)静态库生成动态库
  5. Android属性之excludeFromRecents
  6. java引入Android(安卓)NinePatch技术的意义
  7. maven 学习笔记(二)-创建简单的eclipse+android+maven工程
  8. 使用kotlin开发android
  9. FFmpeg的Android平台移植—编译篇

随机推荐

  1. ActionBar的简单使用(修改背景颜色,文字居
  2. 手机cpu厂商和手机cpu架构
  3. Android(安卓)SDK API 13升级指南
  4. Android视频播放框架一、Vitamio
  5. NDK学习笔记(十四) 使用AVILib+window创
  6. android 用editview 禁用输入法,涉及到的
  7. WebView的Java和javascript相互调用
  8. Android(安卓)fragment 获取id,findViewBy
  9. android点击返回键退出应用的实现
  10. Android(安卓)Adapter