美文网首页
AIDL 进程间通信实例

AIDL 进程间通信实例

作者: 糖葫芦_倩倩 | 来源:发表于2020-12-23 17:13 被阅读0次

    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

    相关文章

      网友评论

          本文标题:AIDL 进程间通信实例

          本文链接:https://www.haomeiwen.com/subject/kjorwktx.html