美文网首页
Android AIDL 跨进程(应用)通讯

Android AIDL 跨进程(应用)通讯

作者: A然后呢 | 来源:发表于2021-08-04 10:42 被阅读0次

Android跨应用通讯

Aapp 创建aidl文件


image.png
// IMyAidlInterface.aidl
package com.example.service;

// Declare any non-default types here with import statements
import com.example.service.AidlBean;  //用到自定义对象的时候,需要引用对象的aidl文件
interface IMyAidlInterface {
   String getData();
   AidlBean getData2();
}

自定义对象为参数的时候需要先创建对应的aidl文件

// AidlBean.aidl
package com.example.bean;  //java类所在的包
parcelable AidlBean;  //序列化类名

自定义对象需要 实现Parcelable 接口,进行序列化

package com.example.bean;

import android.os.Parcel;
import android.os.Parcelable;

public class AidlBean implements Parcelable {
    private String mData;

    public AidlBean(String mData) {
        this.mData = mData;
    }

    protected AidlBean(Parcel in) {
        mData = in.readString();
    }

    public static final Creator<AidlBean> CREATOR = new Creator<AidlBean>() {
        @Override
        public AidlBean createFromParcel(Parcel in) {
            return new AidlBean(in);
        }

        @Override
        public AidlBean[] newArray(int size) {
            return new AidlBean[size];
        }
    };

    public String getmData() {
        return mData;
    }

    public void setmData(String mData) {
        this.mData = mData;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mData);
    }
}

创建一个服务,供其他app监听此服务

package com.example.service.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import com.example.bean.AidlBean;
import com.example.service.IMyAidlInterface;


public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new Mybinder();
    }
    

  //创建一个类,继承aidl生成的类的。Stub      ,生成此类,需要写完aidl文件后,buid一下生成
    class Mybinder extends IMyAidlInterface.Stub{
        @Override
        public String getData() throws RemoteException {
            return "服务端传过来的String";
        }

        @Override
        public AidlBean getData2() throws RemoteException {
            return new AidlBean("测试自定义对象数据");
        }


    }
}

为了能让别的app找到此服务

<service
            android:name="com.example.service.service.MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.myalidl_a.service"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>

至此Aapp完毕

Bapp需要拥有和Aapp相同的 aidl文件,及绑定类,包名必须一致

监听服务

  private void initServer() {

        Intent intent = new Intent();
        intent.setPackage("com.example.myalidl_a");
        intent.setAction("com.example.myalidl_a.service");

        bindService(intent, new ServiceConnection()
        {

            @Override
            public void onServiceConnected(ComponentName name, IBinder service)
            {

                iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);

                //通过 iMyAidlInterface  获取到传递的参数,及传递参数
            }

            @Override
            public void onServiceDisconnected(ComponentName name)
            {

            }
        }, BIND_AUTO_CREATE);




    }

相关文章

网友评论

      本文标题:Android AIDL 跨进程(应用)通讯

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