AIDL 进程间通信实例

1. 进程间通信的方式

  • 使用 Bundle
  • 文件共享(文件锁)
  • 使用 Messenger(串行,单向)
  • 使用 AIDL

2. 创建 server

这里重新创建了一个 module 作为 server 端。

  • 创建一个 aidl 文件 ;
  • 创建 service 实现 aidl 中的接口 ;
  • 暴露 service ;

2.1 创建 aidl 文件

image.png

直接在 java 文件夹下新建 aidl 文件即可,然后会自动生成 aidl 文件夹,我们创建一个 IEasyService.aidl

package com.test.server;

// Declare any non-default types here with import statements

interface IEasyService {

    void connect(String mes);
    void disConnect(String mes);
}

image.png

2.2 创建 service 实现接口

public class EasyService extends Service {


    @Override
    public IBinder onBind(Intent intent) {
        Log.i("qq","onBind: intent="+intent.toString());
        return mBinder;
    }

    IEasyService.Stub mBinder = new IEasyService.Stub() {

        @Override
        public void connect(String mes) throws RemoteException {

            Log.i("qq","connect:   mes = "+mes);
        }

        @Override
        public void disConnect(String mes) throws RemoteException {
            Log.i("qq","disConnect:   mes = "+mes);
        }
    };

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("qq","onUnbind:   ");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.i("qq","onDestroy:   ");
        super.onDestroy();
    }
}

如果你发现你的 IEasyService.Stub 里面实现的方法没有 connect ,就手动点下这个图标

image.png

2.3 暴露 service

在 清单文件中注册一下服务。


        

            
                
            
        

3. 创建 client

server 端的 aidl 文件复制到 client 中,必须包名也是一样的。

image.png

然后就可以点击按钮,绑定远程服务,获取到远程服务的代理对象,进而调用远程方法啦~
代码如下

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);


        findViewById(R.id.load).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //绑定远端服务
                Intent intent = new Intent("com.test.server.IEasyService");
                intent.setPackage("com.test.server") ;
                bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
            }
        });


        findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mEasyService != null ){
                    try {
                        mEasyService.connect("Client connect");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    private IEasyService mEasyService;
    ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mEasyService = IEasyService.Stub.asInterface(service);
            Log.i("qq","已连接上远程服务");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mEasyService = null;
            Log.i("qq","已断开上远程服务");
        }
    };

然后运行看下结果:


reult.gif

你可能感兴趣的:(AIDL 进程间通信实例)