android 进程间通信使用aidl和Messenger类

Posted 彼岸花you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 进程间通信使用aidl和Messenger类相关的知识,希望对你有一定的参考价值。

android development 绑定服务 IBinder相关的三种方式
这里总结的是其中和IPC相关的两种方式,推荐直接瞅官网的,比较详细。

1、android aidl 进程间通信

aidl 为 android interface definition language,android接口定义语言,这门语言主要是实现android进程间通信。进程,在android 虚拟机中,每一个app 运行在一个进程中,如果在一个app中开启一个远程的service,相当于开启了另外一个进程,和当前的app所在的进程是不一样的。

aidl怎么使用

场景:当前app开启远程服务,当前app访问远程Service
① 首先定义一个接口文件,建立Interface接口,以.aidl为后缀

interface IAIDLTest
    void doMethod();

② app要访问其远程的service,具体的实现方法就需要放置到service中。
在远程服务中实现这个aidl的接口

IAIDLTest.Stub aidl = new IAIDLTest.Stub()
    //实现doMethod方法
;

③ 远程中实现了aidl的方法,怎么使得app能访问这个方法。
服务的方法中有一个return Binder的方法。
IAIDL.Stub 类型为Binder类型,就可以直接在服务中进行返回。只要获取到这个Binder对象就能够直接获取到iaidl这个接口了,IAIDL.Stub.asinterface(Binder binder);

④ 代码实例
aidl接口:

// activity与Service之间建立关联:由于使用了远程Service,远程service和当前app应用程序
//所在的进程不一样,需要使用AIDL来进行进程间的通信,以保证Activity和Service进行绑定
interface IAIDLRemoteService 
    void testAidl();

远程service:

public class RemoteService extends Service 
    IAIDLRemoteService.Stub mBinder = new IAIDLRemoteService.Stub() 
        @Override
        public void testAidl() throws RemoteException 
            Log.e("RemoteService", "IAIDLRemoteService.Stub testAidl ");
        
    ;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        return mBinder;
    

app访问远程接口:
使用bindService的方式开启服务

    Intent intent = new Intent();
    intent.setAction("com.tjstudy.servicedemo.RemoteService")
            .setPackage("com.tjstudy.servicedemo");
    bindService(intent, mRemoteServiceConn, BIND_AUTO_CREATE);
    private ServiceConnection mRemoteServiceConn = new ServiceConnection() 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            //获取到Binder对象
            IAIDLRemoteService iaidlRemoteService = IAIDLRemoteService.Stub.asInterface(service);
            try 
                iaidlRemoteService.testAidl();
             catch (RemoteException e) 
                e.printStackTrace();
            
        

        @Override
        public void onServiceDisconnected(ComponentName name) 
        
    ;

2、android 使用Messager类来进行进程间通信

android development 官网提示:

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

aidl在不同进程并且需要多线程处理时才有必要使用,不需要多线程时,可以使用Messager类。下面是官网提供的Messager的方法:使用Messager类进行ipc

  • 在远程service中实现一个内部的Handler并返回IBinder对象
    public static final int REMOTE_METHOD = 10001;

    class RemoteHandler extends Handler
        @Override
        public void handleMessage(Message msg) 
            switch (msg.what)
                case REMOTE_METHOD:
                    Toast.makeText(getApplicationContext(),
                         "remote_method running", Toast.LENGTH_SHORT).show();
                    break;
            
        
    

    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        Messenger messenger = new Messenger(new RemoteHandler());
        return messenger.getBinder();
    
  • app activity中通过bindService开启服务
    定义ServiceConnection
    private Messenger messenger;
    //使用Messenger类进行IPC
    private ServiceConnection mMessengerConn = new ServiceConnection() 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            messenger = new Messenger(service);
        

        @Override
        public void onServiceDisconnected(ComponentName name) 

        
    ;
  • 使用bindService开启服务
    Intent intent = new Intent();
    intent.setAction("com.tjstudy.servicedemo.RemoteService").setPackage("com.tjstudy.servicedemo");
    bindService(intent, mRemoteServiceConn, BIND_AUTO_CREATE);
  • 使用messenger对象发送指定执行某一个方法
    Message message = Message.obtain(null, RemoteService.REMOTE_METHOD, 0, 0);
        try 
            messenger.send(message);
         catch (RemoteException e) 
            e.printStackTrace();
           

记忆模块

进程;ipc通信;bindService;ServiceConnection;service return IBinder;获取IBinder的三种方式(继承Binder类,使用Messenger类和aidl)

以上是关于android 进程间通信使用aidl和Messenger类的主要内容,如果未能解决你的问题,请参考以下文章

Android 使用AIDL实现进程间的通信

Android 进程间通信之Messenger

Android探索之AIDL实现进程间通信

Android开发——进程间通信之AIDL

Android Studio中使用AIDL进行进程间通信

AIDL实现Android进程间通信实例