AIDL 进程间通信示例

AIDL 进程间通信示例

Android小彩虹2021-08-15 5:35:52340A+A-

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

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

<!--将service 暴露出去-->
        <service
            android:name=".EasyService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote">

            <intent-filter>
                <action android:name="com.test.server.IEasyService"/>
            </intent-filter>
        </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

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们