本文为大家分享了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的调用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍WinForm实现跨进程通信的方法,包括了WinForm实现跨进程通信的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例展示了WinForm实现跨进程通信的方法,分享给大家供大家参考之用。具体方法如下: 主要功能代码如下: 希望本文所述实例对大家C#程序设计有所帮助。
概览 Chromium有一个多进程架构,这意味着我们有许多需要互相交流的进程。我们的主要跨进程交流元素是命名管道。在Linux和OS X上,我们使用socketpair()。每个渲染器进程可以分配到一个命名管道来跟浏览器进程交流。这些管道是用异步方式使用的,确保没有哪个端会等待另一个端。 想要得到如何编写安全的IPC端点的知识,请查看IPC安全要点. 浏览器中IPC 在浏览器中,与渲染器的交流是通
我正试图为著名的Dijkstra餐厅哲学家问题实现我自己的解决方案。我得到的只是状态机,一个哲学家应该同时抓住这两个叉子。 这是我的代码: 除了尝试运行在Erlang shell中,我看到的不是进程通信,而是: 苏格拉底是思考吗?孔子是思考吗 我不明白为什么会发生这种情况,因为在我开始编码之前,为了避免迷路,我手工设计了一切。任何帮助赞赏。 这个实现应该是为了防止死锁,因为四个哲学家首先抓住左边的
本文向大家介绍Android IPC机制利用Messenger实现跨进程通信,包括了Android IPC机制利用Messenger实现跨进程通信的使用技巧和注意事项,需要的朋友参考一下 写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的一些理解。这一章使用Messenger实现跨进程通信,其中bindService基础
本文向大家介绍python执行子进程实现进程间通信的方法,包括了python执行子进程实现进程间通信的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python执行子进程实现进程间通信的方法。分享给大家供大家参考。具体实现方法如下: a.py: b.py: 希望本文所述对大家的Python程序设计有所帮助。
本文向大家介绍Python通过队列来实现进程间通信的示例,包括了Python通过队列来实现进程间通信的示例的使用技巧和注意事项,需要的朋友参考一下 Python程序中,在进程和进程之间是不共享全局变量的数据的。 我们来看一个例子: 进程 p1 里对全局变量 nums 循环进行处理,进程 p2 将 nums 打印出来,发现 nums 的值没有变化。 运行结果: in process1 pid=578
本文向大家介绍Linux 进程通信之FIFO的实现,包括了Linux 进程通信之FIFO的实现的使用技巧和注意事项,需要的朋友参考一下 FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信。 创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t
本文向大家介绍c# 如何实现不同进程之间的通信,包括了c# 如何实现不同进程之间的通信的使用技巧和注意事项,需要的朋友参考一下 进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式:1、剪切板;2、COM;3、内存映射文件;4、WCF 1、剪切板Clipboard在进程间传送对象 剪切板是一个供应用程序使用的公有区域。在.NET中定一个了一个D