android studio AIDL的使用(二)发送消息

上一篇链接:android studio AIDL的使用(一)简单使用

1.全部代码:

1.java代码

在这里插入图片描述
Message :

package com.kunminx.exampleaidlmukewang.entity;

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

/**
 * @ClassName Message
 * @Description TODO
 * @Author ${孙伟豪}
 * @Date 2020/11/6 14:54
 * @Version 1.0
 */
public class Message implements Parcelable {//实现序列化,不然不行
    private String content;//发送的内容
    private boolean isSendSuccess;//发送的状态


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.content);
        dest.writeByte(this.isSendSuccess ? (byte) 1 : (byte) 0);
    }

    public Message() {
    }

    protected Message(Parcel in) {
        this.content = in.readString();
        this.isSendSuccess = in.readByte() != 0;
    }

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

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

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isSendSuccess() {
        return isSendSuccess;
    }

    public void setSendSuccess(boolean sendSuccess) {
        isSendSuccess = sendSuccess;
    }
}

MainActivity

package com.kunminx.exampleaidlmukewang;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.kunminx.exampleaidlmukewang.entity.Message;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBtConect;
    private Button mBtDisconnect;
    private Button mBtIsConnected;

    private IConnectionService connectionServiceProxy;
    private IServiceManager serviceManagerProxy;
    private IMessageService messageServiceProxy;
    private Button mBtSendMessage;
    private Button mBtRegisterListener;
    private Button mBtUnregister;
    /**IPC
     * 对AIDL创建的类的方法的实现
     * remoteService对main方法的调用,相当于反向调用
     */
    private MessageReceiverListener messageReceiverListener=new MessageReceiverListener.Stub() {
        @Override
        public void onReceiveMessage(final Message message) throws RemoteException {
            new Handler(Looper.getMainLooper()).post(new Runnable() {//实现方法
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, message.getContent(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        Intent mIntent = new Intent(this, RemoteService.class);
        bindService(mIntent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                serviceManagerProxy = IServiceManager.Stub.asInterface(service);//获取代理
                try {
                    //获取连接代理
                    connectionServiceProxy = IConnectionService.Stub.asInterface(serviceManagerProxy.getService(IConnectionService.class.getSimpleName()));
                    //获取消息代理
                    messageServiceProxy = IMessageService.Stub.asInterface(serviceManagerProxy.getService(IMessageService.class.getSimpleName()));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, BIND_AUTO_CREATE);
    }

    private void initView() {
        mBtConect = (Button) findViewById(R.id.bt_conect);
        mBtDisconnect = (Button) findViewById(R.id.bt_disconnect);
        mBtIsConnected = (Button) findViewById(R.id.bt_isConnected);
        mBtSendMessage = (Button) findViewById(R.id.bt_send_message);
        mBtRegisterListener = (Button) findViewById(R.id.bt_register_listener);
        mBtUnregister = (Button) findViewById(R.id.bt_unregister);

        mBtConect.setOnClickListener(this);
        mBtDisconnect.setOnClickListener(this);
        mBtIsConnected.setOnClickListener(this);
        mBtSendMessage.setOnClickListener(this);
        mBtRegisterListener.setOnClickListener(this);
        mBtUnregister.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_conect:
                try {
                    connectionServiceProxy.connect();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_disconnect:
                try {
                    connectionServiceProxy.disconnect();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_isConnected:
                boolean isConnection = false;
                try {
                    isConnection = connectionServiceProxy.isConnection();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                Toast.makeText(this, String.valueOf(isConnection), Toast.LENGTH_SHORT).show();
                break;
            case R.id.bt_send_message:
                Message message=new Message();
                message.setContent("这个消息来自main");
                try {
                    messageServiceProxy.sendMessage(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_register_listener:
                try {
                    messageServiceProxy.registerMessageReceiveListener(messageReceiverListener);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_unregister:
                try {
                    messageServiceProxy.unRegisterMessageReceiveListener(messageReceiverListener);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

RemoteService

package com.kunminx.exampleaidlmukewang;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.widget.Toast;

import com.kunminx.exampleaidlmukewang.entity.Message;

import java.util.ArrayList;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class RemoteService extends Service {

    private boolean isConnected = false;
    //用arrayList来储存消息的监听
    private ArrayList<MessageReceiverListener> messageReceiverListenerArrayList = new ArrayList<>();
    private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
    //模拟消息接收的过程,通过定时任务
    private ScheduledFuture scheduledFuture;


    public RemoteService() {
    }

    private Handler handler = new Handler(Looper.getMainLooper());
    //注意:下面这些都是运行在子线程中的,所有Toast要线程通信
    private IConnectionService connectionService = new IConnectionService.Stub() {
        @Override
        public void connect() throws RemoteException {
            try {
                Thread.sleep(5000);
                isConnected = true;
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(RemoteService.this, "connect", Toast.LENGTH_SHORT).show();
                    }
                });
                //单位:s
                scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(
                        new Runnable() {
                            @Override
                            public void run() {
                                //遍历消息接收的监听
                                for (MessageReceiverListener messageReceiverListener : messageReceiverListenerArrayList) {
                                    Message message = new Message();
                                    message.setContent("这个消息来自remoteService");
                                    try {
                                        messageReceiverListener.onReceiveMessage(message);
                                    } catch (RemoteException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }//执行的方法
                        , 5000//第一次执行的时间
                        , 5000//执行时间间隔
                        , TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void disconnect() throws RemoteException {
            isConnected = false;

            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(RemoteService.this, "idsconnect", Toast.LENGTH_SHORT).show();
                }
            });
            //断联后把定时任务停掉
            scheduledFuture.cancel(true);

        }

        @Override
        public boolean isConnection() throws RemoteException {
            return isConnected;
        }
    };
    //消息服务
    private IMessageService messageService = new IMessageService.Stub() {
        @Override
        public void sendMessage(final Message message) throws RemoteException {
            //打印消息内容
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(RemoteService.this, message.getContent(), Toast.LENGTH_SHORT).show();
                }
            });
            if (isConnected) {
                message.setSendSuccess(true);
            } else {
                message.setSendSuccess(false);
            }
        }

        @Override
        public void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
            if (messageReceiverListener != null) {//如果消息监听不为空,就把它添加进来(注册)
                messageReceiverListenerArrayList.add(messageReceiverListener);
            }
        }

        @Override
        public void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
            if (messageReceiverListener != null) {//取消注册
                messageReceiverListenerArrayList.remove(messageReceiverListener);
            }
        }
    };
    private IServiceManager serviceManager=new IServiceManager.Stub() {
        @Override
        public IBinder getService(String serviceName) throws RemoteException {
            if (IConnectionService.class.getSimpleName().equals(serviceName)) {
                return connectionService.asBinder();
            }else if (IMessageService.class.getSimpleName().equals(serviceName)){
                return messageService.asBinder();
            }else {
                return null;
            }
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        return serviceManager.asBinder();
    }
    @Override
    public void onCreate() {
        super.onCreate();
        scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">


    <Button
        android:id="@+id/bt_conect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="connect" />

    <Button
        android:id="@+id/bt_disconnect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="disconnect" />

    <Button
        android:id="@+id/bt_isConnected"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="isConnected" />


    <Button
        android:id="@+id/bt_send_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="send" />

    <Button
        android:id="@+id/bt_register_listener"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="register" />

    <Button
        android:id="@+id/bt_unregister"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="unregister" />
</LinearLayout>

2.AIDL代码:

在这里插入图片描述
Message

// Message.aidl
//修改包名,因为他是在entity下的
//package com.kunminx.exampleaidlmukewang;
package com.kunminx.exampleaidlmukewang.entity;//包名与java上的要保持一致
parcelable Message;//这句话就让源码上的Message与AIDL上的Message进行了关联。这里AIDL文件上是无法直接调用java文件Message的,所以创建两个,进行关联

//因为是一个实体类,不是接口,所以把接口去掉
//interface Message {
//
//}

IConnectionService

// IConnectionService.aidl
package com.kunminx.exampleaidlmukewang;

// 连接服务

interface IConnectionService {
//oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
//不能设置返回值
oneway void connect();//连接
void disconnect();//断开连接
boolean isConnection();//获取连接状态
}


IMessageService
// IMessageService.aidl
package com.kunminx.exampleaidlmukewang;
//要使用AIDL上的Message就要import进来(自己写)
import com.kunminx.exampleaidlmukewang.entity.Message;
import com.kunminx.exampleaidlmukewang.MessageReceiverListener;
/*
消息服务
*/
interface IMessageService {
//实体类前面要有一个in关键字,基本类型不需要
      void sendMessage(in Message message);
      //注册
      void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener);//接口不用
      //取消注册
      void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener);
}

IServiceManager

// IServiceManager.aidl
package com.kunminx.exampleaidlmukewang;


interface IServiceManager {
    IBinder getService(String serviceName);//根据名字获取aidl生成类
}

MessageReceiverListener

// MessageReceiverListener.aidl
package com.kunminx.exampleaidlmukewang;
import com.kunminx.exampleaidlmukewang.entity.Message;
/*
消息的监听
*/
interface MessageReceiverListener {
//搜到消息的回调
void onReceiveMessage(in Message message);

}

3.AIDL生成的代码

IConnectionService

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
// 连接服务

public interface IConnectionService extends android.os.IInterface
{
  /** Default implementation for IConnectionService. */
  public static class Default implements com.kunminx.exampleaidlmukewang.IConnectionService
  {
    //oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
    //不能设置返回值

    @Override public void connect() throws android.os.RemoteException
    {
    }
    //连接

    @Override public void disconnect() throws android.os.RemoteException
    {
    }
    //断开连接

    @Override public boolean isConnection() throws android.os.RemoteException
    {
      return false;
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IConnectionService
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IConnectionService";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IConnectionService interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.IConnectionService asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IConnectionService))) {
        return ((com.kunminx.exampleaidlmukewang.IConnectionService)iin);
      }
      return new com.kunminx.exampleaidlmukewang.IConnectionService.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_connect:
        {
          data.enforceInterface(descriptor);
          this.connect();
          return true;
        }
        case TRANSACTION_disconnect:
        {
          data.enforceInterface(descriptor);
          this.disconnect();
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_isConnection:
        {
          data.enforceInterface(descriptor);
          boolean _result = this.isConnection();
          reply.writeNoException();
          reply.writeInt(((_result)?(1):(0)));
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.IConnectionService
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      //oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
      //不能设置返回值

      @Override public void connect() throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          boolean _status = mRemote.transact(Stub.TRANSACTION_connect, _data, null, android.os.IBinder.FLAG_ONEWAY);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().connect();
            return;
          }
        }
        finally {
          _data.recycle();
        }
      }
      //连接

      @Override public void disconnect() throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          boolean _status = mRemote.transact(Stub.TRANSACTION_disconnect, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().disconnect();
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      //断开连接

      @Override public boolean isConnection() throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          boolean _status = mRemote.transact(Stub.TRANSACTION_isConnection, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            return getDefaultImpl().isConnection();
          }
          _reply.readException();
          _result = (0!=_reply.readInt());
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      public static com.kunminx.exampleaidlmukewang.IConnectionService sDefaultImpl;
    }
    static final int TRANSACTION_connect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_disconnect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_isConnection = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IConnectionService impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.IConnectionService getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  //oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
  //不能设置返回值

  public void connect() throws android.os.RemoteException;
  //连接

  public void disconnect() throws android.os.RemoteException;
  //断开连接

  public boolean isConnection() throws android.os.RemoteException;
}

IMessageService

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
/*
消息服务
*/
public interface IMessageService extends android.os.IInterface
{
  /** Default implementation for IMessageService. */
  public static class Default implements com.kunminx.exampleaidlmukewang.IMessageService
  {
    //实体类前面要有一个in关键字,基本类型不需要

    @Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
    {
    }
    //注册

    @Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
    {
    }
    //接口不用
    //取消注册

    @Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IMessageService
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IMessageService";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IMessageService interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.IMessageService asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IMessageService))) {
        return ((com.kunminx.exampleaidlmukewang.IMessageService)iin);
      }
      return new com.kunminx.exampleaidlmukewang.IMessageService.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_sendMessage:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.entity.Message _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          this.sendMessage(_arg0);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_registerMessageReceiveListener:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
          _arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
          this.registerMessageReceiveListener(_arg0);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_unRegisterMessageReceiveListener:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
          _arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
          this.unRegisterMessageReceiveListener(_arg0);
          reply.writeNoException();
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.IMessageService
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      //实体类前面要有一个in关键字,基本类型不需要

      @Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          if ((message!=null)) {
            _data.writeInt(1);
            message.writeToParcel(_data, 0);
          }
          else {
            _data.writeInt(0);
          }
          boolean _status = mRemote.transact(Stub.TRANSACTION_sendMessage, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().sendMessage(message);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      //注册

      @Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
          boolean _status = mRemote.transact(Stub.TRANSACTION_registerMessageReceiveListener, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().registerMessageReceiveListener(messageReceiverListener);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      //接口不用
      //取消注册

      @Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
          boolean _status = mRemote.transact(Stub.TRANSACTION_unRegisterMessageReceiveListener, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().unRegisterMessageReceiveListener(messageReceiverListener);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      public static com.kunminx.exampleaidlmukewang.IMessageService sDefaultImpl;
    }
    static final int TRANSACTION_sendMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_registerMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_unRegisterMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IMessageService impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.IMessageService getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  //实体类前面要有一个in关键字,基本类型不需要

  public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
  //注册

  public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
  //接口不用
  //取消注册

  public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
}

IServiceManager

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
public interface IServiceManager extends android.os.IInterface
{
  /** Default implementation for IServiceManager. */
  public static class Default implements com.kunminx.exampleaidlmukewang.IServiceManager
  {
    @Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
    {
      return null;
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IServiceManager
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IServiceManager";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IServiceManager interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.IServiceManager asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IServiceManager))) {
        return ((com.kunminx.exampleaidlmukewang.IServiceManager)iin);
      }
      return new com.kunminx.exampleaidlmukewang.IServiceManager.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_getService:
        {
          data.enforceInterface(descriptor);
          java.lang.String _arg0;
          _arg0 = data.readString();
          android.os.IBinder _result = this.getService(_arg0);
          reply.writeNoException();
          reply.writeStrongBinder(_result);
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.IServiceManager
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      @Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        android.os.IBinder _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeString(serviceName);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getService, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            return getDefaultImpl().getService(serviceName);
          }
          _reply.readException();
          _result = _reply.readStrongBinder();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      public static com.kunminx.exampleaidlmukewang.IServiceManager sDefaultImpl;
    }
    static final int TRANSACTION_getService = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IServiceManager impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.IServiceManager getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException;
}

MessageReceiverListener

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
/*
消息的监听
*/
public interface MessageReceiverListener extends android.os.IInterface
{
  /** Default implementation for MessageReceiverListener. */
  public static class Default implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
  {
    //搜到消息的回调

    @Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.MessageReceiverListener";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.MessageReceiverListener interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.MessageReceiverListener asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.MessageReceiverListener))) {
        return ((com.kunminx.exampleaidlmukewang.MessageReceiverListener)iin);
      }
      return new com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_onReceiveMessage:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.entity.Message _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          this.onReceiveMessage(_arg0);
          reply.writeNoException();
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      //搜到消息的回调

      @Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          if ((message!=null)) {
            _data.writeInt(1);
            message.writeToParcel(_data, 0);
          }
          else {
            _data.writeInt(0);
          }
          boolean _status = mRemote.transact(Stub.TRANSACTION_onReceiveMessage, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().onReceiveMessage(message);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      public static com.kunminx.exampleaidlmukewang.MessageReceiverListener sDefaultImpl;
    }
    static final int TRANSACTION_onReceiveMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.MessageReceiverListener impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.MessageReceiverListener getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  //搜到消息的回调

  public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
}

2.步骤:

1.创建bean类Message,实现序列化与getter和setter方法

序列化:用下面这个插件,可以自己去下载安装。然后在getter和setter方法,实现两个就行
在这里插入图片描述
代码:

/**
 * @ClassName Message
 * @Description TODO
 * @Author ${孙伟豪}
 * @Date 2020/11/6 14:54
 * @Version 1.0
 */
public class Message implements Parcelable {//实现序列化,不然不行
    private String content;//发送的内容
    private boolean isSendSuccess;//发送的状态


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.content);
        dest.writeByte(this.isSendSuccess ? (byte) 1 : (byte) 0);
    }

    public Message() {
    }

    protected Message(Parcel in) {
        this.content = in.readString();
        this.isSendSuccess = in.readByte() != 0;
    }

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

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

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isSendSuccess() {
        return isSendSuccess;
    }

    public void setSendSuccess(boolean sendSuccess) {
        isSendSuccess = sendSuccess;
    }
}

2.创建AIDL文件Message,用于关联Message

//修改包名,因为他是在entity下的
//package com.kunminx.exampleaidlmukewang;
package com.kunminx.exampleaidlmukewang.entity;//包名与java上的要保持一致
parcelable Message;//这句话就让源码上的Message与AIDL上的Message进行了关联。这里AIDL文件上是无法直接调用java文件Message的,所以创建两个,进行关联

//因为是一个实体类,不是接口,所以把接口去掉
//interface Message {
//
//}

这里Message.java与Message.aidl包名路径要一致,不然会不行
在这里插入图片描述
在这里插入图片描述

3.创建消息接收监听类

// MessageReceiverListener.aidl
package com.kunminx.exampleaidlmukewang;
import com.kunminx.exampleaidlmukewang.entity.Message;
/*
消息的监听
*/
interface MessageReceiverListener {
//搜到消息的回调
void onReceiveMessage(in Message message);

}

自己导包
在这里插入图片描述

4.创建消息服务AIDL类

// IMessageService.aidl
package com.kunminx.exampleaidlmukewang;
//要使用AIDL上的Message就要import进来(自己写)
import com.kunminx.exampleaidlmukewang.entity.Message;
import com.kunminx.exampleaidlmukewang.MessageReceiverListener;
/*
消息服务
*/
interface IMessageService {
//实体类前面要有一个in关键字,基本类型不需要
      void sendMessage(in Message message);
      //注册
      void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener);//接口不用
      //取消注册
      void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener);
}

在这里插入图片描述

5.在这里插入图片描述

6.生成的类

在这里插入图片描述
生成类的代码
IMessageService :

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
/*
消息服务
*/
public interface IMessageService extends android.os.IInterface
{
  /** Default implementation for IMessageService. */
  public static class Default implements com.kunminx.exampleaidlmukewang.IMessageService
  {
    //实体类前面要有一个in关键字,基本类型不需要

    @Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
    {
    }
    //注册

    @Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
    {
    }
    //接口不用
    //取消注册

    @Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IMessageService
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IMessageService";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IMessageService interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.IMessageService asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IMessageService))) {
        return ((com.kunminx.exampleaidlmukewang.IMessageService)iin);
      }
      return new com.kunminx.exampleaidlmukewang.IMessageService.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_sendMessage:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.entity.Message _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          this.sendMessage(_arg0);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_registerMessageReceiveListener:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
          _arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
          this.registerMessageReceiveListener(_arg0);
          reply.writeNoException();
          return true;
        }
        case TRANSACTION_unRegisterMessageReceiveListener:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
          _arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
          this.unRegisterMessageReceiveListener(_arg0);
          reply.writeNoException();
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.IMessageService
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      //实体类前面要有一个in关键字,基本类型不需要

      @Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          if ((message!=null)) {
            _data.writeInt(1);
            message.writeToParcel(_data, 0);
          }
          else {
            _data.writeInt(0);
          }
          boolean _status = mRemote.transact(Stub.TRANSACTION_sendMessage, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().sendMessage(message);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      //注册

      @Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
          boolean _status = mRemote.transact(Stub.TRANSACTION_registerMessageReceiveListener, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().registerMessageReceiveListener(messageReceiverListener);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      //接口不用
      //取消注册

      @Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
          boolean _status = mRemote.transact(Stub.TRANSACTION_unRegisterMessageReceiveListener, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().unRegisterMessageReceiveListener(messageReceiverListener);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      public static com.kunminx.exampleaidlmukewang.IMessageService sDefaultImpl;
    }
    static final int TRANSACTION_sendMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_registerMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_unRegisterMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IMessageService impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.IMessageService getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  //实体类前面要有一个in关键字,基本类型不需要

  public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
  //注册

  public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
  //接口不用
  //取消注册

  public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
}

MessageReceiverListener :

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
/*
消息的监听
*/
public interface MessageReceiverListener extends android.os.IInterface
{
  /** Default implementation for MessageReceiverListener. */
  public static class Default implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
  {
    //搜到消息的回调

    @Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
    {
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.MessageReceiverListener";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.MessageReceiverListener interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.MessageReceiverListener asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.MessageReceiverListener))) {
        return ((com.kunminx.exampleaidlmukewang.MessageReceiverListener)iin);
      }
      return new com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_onReceiveMessage:
        {
          data.enforceInterface(descriptor);
          com.kunminx.exampleaidlmukewang.entity.Message _arg0;
          if ((0!=data.readInt())) {
            _arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
          }
          else {
            _arg0 = null;
          }
          this.onReceiveMessage(_arg0);
          reply.writeNoException();
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      //搜到消息的回调

      @Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          if ((message!=null)) {
            _data.writeInt(1);
            message.writeToParcel(_data, 0);
          }
          else {
            _data.writeInt(0);
          }
          boolean _status = mRemote.transact(Stub.TRANSACTION_onReceiveMessage, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            getDefaultImpl().onReceiveMessage(message);
            return;
          }
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      public static com.kunminx.exampleaidlmukewang.MessageReceiverListener sDefaultImpl;
    }
    static final int TRANSACTION_onReceiveMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.MessageReceiverListener impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.MessageReceiverListener getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  //搜到消息的回调

  public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
}

7.在RemoteService实现消息服务

//消息服务
    private IMessageService messageService = new IMessageService.Stub() {
        @Override
        public void sendMessage(final Message message) throws RemoteException {
            //打印消息内容
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(RemoteService.this, message.getContent(), Toast.LENGTH_SHORT).show();
                }
            });
            if (isConnected) {//如果连接
                message.setSendSuccess(true);//设置返回结果为true
            } else {
                message.setSendSuccess(false);
            }
        }

        @Override
        public void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
            if (messageReceiverListener != null) {//如果消息监听不为空,就把它添加进来(注册)
                messageReceiverListenerArrayList.add(messageReceiverListener);
            }
        }

        @Override
        public void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
            if (messageReceiverListener != null) {//取消注册
                messageReceiverListenerArrayList.remove(messageReceiverListener);
            }
        }
    };
1.问题:

在这里插入图片描述

2.解决:
  1. 创建一个返回ADIL生成的类的处理者,它可以根据传入名获取想要的AIDL生成的类
// IServiceManager.aidl
package com.kunminx.exampleaidlmukewang;


interface IServiceManager {
    IBinder getService(String serviceName);//根据名字获取aidl生成类
}

在这里插入图片描述

8.编译在这里插入图片描述

生成类的代码:
IServiceManager :

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package com.kunminx.exampleaidlmukewang;
public interface IServiceManager extends android.os.IInterface
{
  /** Default implementation for IServiceManager. */
  public static class Default implements com.kunminx.exampleaidlmukewang.IServiceManager
  {
    @Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
    {
      return null;
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IServiceManager
  {
    private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IServiceManager";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IServiceManager interface,
     * generating a proxy if needed.
     */
    public static com.kunminx.exampleaidlmukewang.IServiceManager asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IServiceManager))) {
        return ((com.kunminx.exampleaidlmukewang.IServiceManager)iin);
      }
      return new com.kunminx.exampleaidlmukewang.IServiceManager.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      switch (code)
      {
        case INTERFACE_TRANSACTION:
        {
          reply.writeString(descriptor);
          return true;
        }
        case TRANSACTION_getService:
        {
          data.enforceInterface(descriptor);
          java.lang.String _arg0;
          _arg0 = data.readString();
          android.os.IBinder _result = this.getService(_arg0);
          reply.writeNoException();
          reply.writeStrongBinder(_result);
          return true;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
    }
    private static class Proxy implements com.kunminx.exampleaidlmukewang.IServiceManager
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      @Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        android.os.IBinder _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeString(serviceName);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getService, _data, _reply, 0);
          if (!_status && getDefaultImpl() != null) {
            return getDefaultImpl().getService(serviceName);
          }
          _reply.readException();
          _result = _reply.readStrongBinder();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      public static com.kunminx.exampleaidlmukewang.IServiceManager sDefaultImpl;
    }
    static final int TRANSACTION_getService = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IServiceManager impl) {
      // Only one user of this interface can use this function
      // at a time. This is a heuristic to detect if two different
      // users in the same process use this function.
      if (Stub.Proxy.sDefaultImpl != null) {
        throw new IllegalStateException("setDefaultImpl() called twice");
      }
      if (impl != null) {
        Stub.Proxy.sDefaultImpl = impl;
        return true;
      }
      return false;
    }
    public static com.kunminx.exampleaidlmukewang.IServiceManager getDefaultImpl() {
      return Stub.Proxy.sDefaultImpl;
    }
  }
  public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException;
}

9.在Remote中实现IServiceManager

private IServiceManager serviceManager=new IServiceManager.Stub() {
        @Override
        public IBinder getService(String serviceName) throws RemoteException {
        //根据传入的名字来获取对应的AIDL生成的对象
            if (IConnectionService.class.getSimpleName().equals(serviceName)) {
                return connectionService.asBinder();
            }else if (IMessageService.class.getSimpleName().equals(serviceName)){
                return messageService.asBinder();
            }else {
                return null;
            }
        }
    };

在这里插入图片描述

10.修改一下返回的值

在这里插入图片描述

11.通过定时任务,模拟消息接收过程

这里是每五秒进行一次

//成员变量
    private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
    //模拟消息接收的过程,通过定时任务
    private ScheduledFuture scheduledFuture;

初始化:重写onCreate方法

@Override
    public void onCreate() {
        super.onCreate();
        scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
    }
//单位:s
                scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(
                        new Runnable() {
                            @Override
                            public void run() {
                                //遍历消息接收的监听
                                for (MessageReceiverListener messageReceiverListener : messageReceiverListenerArrayList) {
                                    Message message = new Message();
                                    message.setContent("这个消息来自remoteService");
                                    try {
                                        messageReceiverListener.onReceiveMessage(message);
                                    } catch (RemoteException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }//执行的方法
                        , 5000//第一次执行的时间
                        , 5000//执行时间间隔
                        , TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

12.MainActivity实现MessageReceiverListener方法

之前都是在remoteService实现,在MainActivity里面调用,这里AIDL创建的类是在MainActivity里面实现的,他被remoteService调用

/**IPC
     * 对AIDL创建的类的方法的实现
     * remoteService对main方法的调用,相当于反向调用
     */
    private MessageReceiverListener messageReceiverListener=new MessageReceiverListener.Stub() {
        @Override
        public void onReceiveMessage(final Message message) throws RemoteException {
            new Handler(Looper.getMainLooper()).post(new Runnable() {//实现方法
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, message.getContent(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    };

13.初始化代理,获得连接,消息代理

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        Intent mIntent = new Intent(this, RemoteService.class);
        bindService(mIntent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                serviceManagerProxy = IServiceManager.Stub.asInterface(service);//获取代理
                try {
                    //获取连接代理
                    connectionServiceProxy = IConnectionService.Stub.asInterface(serviceManagerProxy.getService(IConnectionService.class.getSimpleName()));
                    //获取消息代理
                    messageServiceProxy = IMessageService.Stub.asInterface(serviceManagerProxy.getService(IMessageService.class.getSimpleName()));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        }, BIND_AUTO_CREATE);
    }

14.调用方法

case R.id.bt_send_message:
                Message message=new Message();
                message.setContent("这个消息来自main");
                try {
                    messageServiceProxy.sendMessage(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_register_listener:
                try {
                    messageServiceProxy.registerMessageReceiveListener(messageReceiverListener);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_unregister:
                try {
                    messageServiceProxy.unRegisterMessageReceiveListener(messageReceiverListener);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;

15.问题,unRegisterMessage,它还是一直执行

解决办法:下一篇再来,写太多了

3.总结与反思:

1.图解

IMessageService
在这里插入图片描述
IMessageReceiverListener
在这里插入图片描述

2.

3.

4.

5.

6.

4.android studio AIDL的使用(三)解决无法取消注册问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android Studio中的AIDLAndroid接口定义语言的缩写,它是一种用于定义Android应用程序中的进程间通信(IPC)接口的语言。使用AIDL,您可以定义客户端和服务之间的接口,以便它们可以相互通信和交换数据。在Android应用程序中,AIDL通常用于实现跨进程通信,例如在应用程序中使用服务来执行后台任务。 ### 回答2: Android Studio AIDLAndroid Interface Definition Language)是一种用于在Android应用程序中进行进程间通信(IPC)的技术。它允许不同应用程序或同一应用程序中的不同进程之间进行数据和指令的传输和共享。AIDL基于Binder机制实现,是许多Android系统服务和框架中广泛使用的IPC技术。 在Android Studio使用AIDL,首先需要创建一个AIDL接口,该接口定义了可用于在不同进程之间进行通信的方法。一旦创建了该接口,它可以在应用程序中使用,与其他进程交换数据和指令。AIDLAndroid系统自动创建和管理,不需要手动实现Binder机制。 使用AIDL的主要优点是实现非常方便,而且可以跨多个进程使用。它使得应用程序能够高效地共享数据和指令,并允许不同进程之间进行通信,从而扩展了Android应用程序的功能和交互性。 一些开发人员可能认为AIDL的学习和使用有一定的难度,但是一旦了解了AIDL的基本原理和使用方法,就能够轻松实现IPC功能,并创建更高效的Android应用程序。总之,通过使用AIDLAndroid应用程序开发人员可以实现更好的应用程序设计和创新,并提高应用程序的性能和用户体验。 ### 回答3: Android Studio AIDLAndroid Interface Definition Language)是一种跨进程通信的机制,用于在不同的Android组件之间进行通信。 AIDL类似于SOAP(Simple Object Access Protocol),RPC(Remote Procedure Call)或CORBA(Common Object Request Broker Architecture),它是一种高级的RPC机制,允许不同的应用程序使用相同的接口来进行通信。 AIDL的主要作用是允许一个应用程序通过一个中间层向另外的一个应用程序发送请求,并且读取响应信息。它是Android操作系统提供的默认RPC机制,由于基于Binder实现,因此具备更高的性能和更好的稳定性。 AIDL可以让你定义一组接口,用来描述应用组件之间的通信方法,包括输入和输出参数。AIDL文件定义完毕后,你可以使用Android Studio自动生成AIDL接口的Java类,以便你可以跨进程访问该接口。 使用AIDL的好处是,可以将系统拆分成独立的组件,这些组件可以在不同的进程之间进行通信,从而实现了更好的资源利用和更加灵活的架构设计。 总之,Android Studio AIDL是一种强大的跨进程通信机制,有助于提高应用程序的性能和稳定性,从而让我们能够更好地设计和开发更高效的Android应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值