本文为大家分享了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 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. kotlin技巧和细节整理
  2. .Net程序员玩转Android开发---(20)Android绑定服务
  3. Android(安卓)ViewRootImpl 解析
  4. 一只不务正业的程序猿玩出个Processing交互库
  5. android Service相关知识点
  6. 在Android(安卓)studio中调用python代码
  7. Android开发杂项总结
  8. Android中的OnMeasure及OnLayout
  9. Android进程-zygote进程

随机推荐

  1. android的service如何接收触摸事件。
  2. Android中GridView来显示图片
  3. android edittext编辑框光标改变事件
  4. Android(安卓)5.1 SystemUI-状态栏
  5. android 获取wifi 信号质量
  6. android 弹出软盘
  7. android 判断联网类型
  8. Android(安卓)3rd-party libraries
  9. android联系人过滤
  10. Build Variants Android变体构建配置