Android 使用AIDL跨进程通信

每日一言:做人有度,做事有尺。

欢迎一起讨论和学习,QQ732258496 微信:15520726587



第一节 基本概念介绍

                  IPC进程间的通讯 (详见上一篇文章)


                  以下仅仅是通讯的其中一种方式:

                          binder 进程间的通讯的机制 (连接池)

                          AIDL Android接口定义语言

                          Parcelable 序列化



第二节 服务器端(另一个APP)

                 1.新建文件,注意包名 ,AlipayService /PersonMsg(传递的对象实体)/IAlipayService/PersonMsg

Android 使用AIDL跨进程通信_第1张图片

Android 使用AIDL跨进程通信_第2张图片

1.PersonMsg.class ,需要实现Parcelable接口(如果自动实现这个类,请注意漏掉部分代码)

public class PersonMsg implements Parcelable {

  private String name = null;
  private int age = 0;

  protected PersonMsg() {
  }

  protected PersonMsg(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  protected PersonMsg(Parcel in) {
    name = in.readString();
    age = in.readInt();
  }


  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

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

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

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

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

2.AlipayService.class

public class AlipayService extends Service {

  private class AlipayAgent extends IAlipayService.Stub {

    @Override
    public int callPayInService(int account, int money)
        throws RemoteException {
      int result = pay(account, money);
      Log.d("提示:", "收到了客户端的请求");
      return result;
    }

    @Override
    public PersonMsg name() throws RemoteException {
      PersonMsg mode = new PersonMsg("贾旭飞",28);
      return mode;
    }


  }

  @Override
  public IBinder onBind(Intent intent) {

    return new AlipayAgent();
  }

  @Override
  public void onCreate() {

    System.out.println("alipay 服务 创建 了 ");
    super.onCreate();
  }

  @Override
  public void onDestroy() {
    System.out.println("alipay 服务 销毁 了 ");
    super.onDestroy();
  }

  public int pay(int account, int money) {
    Log.d("提示:", "alipay 支付 OK 了");
    return 1;
  }
}


3.IAlipayService.aidl

// IAlipayService.aidl
package com.jiaxufei.fistkotlinprogram;
import com.jiaxufei.fistkotlinprogram.PersonMsg;

interface IAlipayService {
  int callPayInService(int account, int money);
  PersonMsg name();
}
4.PersonMsg.aidl

// IAlipayService.aidl
package com.jiaxufei.fistkotlinprogram;
import com.jiaxufei.fistkotlinprogram.PersonMsg;

parcelable PersonMsg;
5.特别注意配置文件(见下图)

Android 使用AIDL跨进程通信_第3张图片

第三节 客户端(另一个APP)

注意点:PersonMsg.class,IAlipayService.aidl,PersonMsg.aidl全部从服务器端复制过来,文件路径一定和服务器端的路径一致。

                                                 Android 使用AIDL跨进程通信_第4张图片

1.MainActivity.class

public class MainActivity extends AppCompatActivity {

  TextView tvWord;//点击的事件

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tvWord = (TextView) findViewById(R.id.tv_text);
    bindService();

    tvWord.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (iServer != null) {
          call();
        } else {
          Log.d("提示", "服务为空!");
        }

      }
    });


  }


  public void bindService() {

    //绑定 alipay的 服务

    Log.d("bindService", "bindService");
    Intent intent = new Intent();
    intent.setPackage("com.jiaxufei.fistkotlinprogram");
    intent.setAction("com.test.alipay");
    //  intent.setComponent(new ComponentName("com.jiaxufei.fistkotlinprogram","com.jiaxufei.fistkotlinprogram.IAlipayService"));
    bindService(intent, serviceConnection, BIND_AUTO_CREATE);

  }

  private IAlipayService iServer;

  private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      iServer = IAlipayService.Stub.asInterface(service);
      Log.d("onServiceConnected", "onServiceConnected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      iServer = null;
      Log.d("onServiceDisconnected", "onServiceDisconnected");
    }
  };

  public void call() {

    try {
      int result = iServer.callPayInService(1, 2);
      PersonMsg mode =iServer.name();
      Log.d("提示数字结果:", result + "");
     Log.d("提示对象结果:",  mode.getName()+"");
    } catch (RemoteException e) {
      e.printStackTrace();
    }
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    unbindService(serviceConnection);
  }
}

第四节 感想

 多问几个为什么,然后去查百度,寻找自己可以理解的文章学习。




你可能感兴趣的:(Android)