本文為大家分享了Android AIDL實現兩個APP間的跨進程通信實例,供大家參考,具體內容如下
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<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端結構如下
	
	首先我們要講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的調用。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答