本文为大家分享了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,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的调用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:Android使用AIDL实现两个App间通信Android AIDL和远程Service调用示例代码Android应用程序四大组件之使用AIDL如何实现跨进程调用ServiceAndroid通过AIDL在两个APP之间Service通信 总结以上是内存溢出为你收集整理的Android AIDL实现两个APP间的跨进程通信实例全部内容,希望文章能够帮你解决Android AIDL实现两个APP间的跨进程通信实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)