时间:2020-10-17 10:55:12 | 栏目:Android代码 | 点击:次
本文为大家分享了Android AIDL实现两个APP间的跨进程通信实例,供大家参考,具体内容如下
1 Service端创建
首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信
servier端结构如下
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端结构如下
首先我们要讲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的调用。