Android进程间通信详解(2)

只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程(多任务)时,才有必要使用 AIDL。 如果您不需要执行跨越不同应用的并发 IPC,就应该通过实现一个 Binder 创建接口;或者,如果您想执行 IPC,但根本不需要处理多线程,则使用 Messenger 类来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务。
aidl文档

1.通过 Messenger进行传递(handler),在远程服务里创建handler(接收客户端发送的消息)、 Messenger对像,在onbind里返回( Messenger.getbinder)。在客户端绑定服务,拿着 Messenger对象发消息(可以用bundle)。在远程服务的handlermessage方法就会收到。他是一个个处理的,如果大量并发请求用aidl, Messenger底层就是aidl

在客户端中创建一个Messenger。然后,当客户端收到 onServiceConnected() 回调时,会向服务发送一条 Message,并在其 send() 方法的 replyTo 参数中包含客户端的 Messenger。
注意:Messenger和Message是俩个东西

  public void sayHello(View v) {         if (!mBound) return;         Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);         try {           mService.send(msg);         } catch (RemoteException e) {             e.printStackTrace();         }     }

2.直接使用Binder对象:缺点是这种方式不能进行跨进程,跨应用程序的函数调用。只能实现在同一个进程之中,同一个应用程序之中的不同的组件之间通讯。

用法:继承Binder,然后在service里return
继承Binder用它的对象返回,客户端将bind对象强转成自定义Bind

AIDL

Android interface definition language (android接口定义语言) , 用来跨进程的访问方法。

aidl操作步骤:
1.在两个项目中新建普通文件(new ->General->File),后缀名改成(aidl),客户端和服务端中这个文件所在的包名要保持一致,内容也要一样
编译之后, 会在gen目录下,自动产生同名的,后缀为 Java 的文件。里面有我们要用到的 Stub类。

public static abstract class Stub extends android.os.Binder implements com.example.aidl.AidlFunctions

2.在接口文件AIDLFunctions.aidl中,我们定义一个方法 show

interface AidlFunctions{ void show(); }

3.AIDL的使用,需要一个Service配合,所以我们在服务端还要声明一个Service

public class AIDLService extends Service { //stub就是系统自动产生的 AidlFunctions.Stub binder; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub binder = new AidlFunctions.Stub() { @Override //这里是我们在接口中声明的方法的实现 public void show() throws RemoteException { // TODO Auto-generated method stub System.out.println("--------------------收到----------------------"); } }; return binder; } }

4.客户端:

//绑定服务,要用到ServiceConnection private ServiceConnection serviceConnection; //自定义的接口,和服务端一样 private AidlFunctions aidlFunctions; serviceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { System.out.println("--------------------ServiceDisconnected----------------------"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("--------------------ServiceConnected----------------------"); aidlFunctions = AidlFunctions.Stub.asInterface(service); } }; Intent intent = new Intent("com.example.androidaidl.AIDLService"); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); //调用show方法 try { aidlFunctions.show(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); }

使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有些应用后台是有多个进程的,启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。因为它们要常驻后台,特别是即时通讯或者社交应用。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a0e8bfebec6b9b35f9647a64dd3155c0.html