Android 使用AIDL跨进程通信
每日一言:做人有度,做事有尺。
欢迎一起讨论和学习,QQ:732258496 微信:15520726587
第一节 基本概念介绍
IPC进程间的通讯 (详见上一篇文章)
以下仅仅是通讯的其中一种方式:
binder 进程间的通讯的机制 (连接池)
AIDL Android接口定义语言
Parcelable 序列化
第二节 服务器端(另一个APP)
1.新建文件,注意包名 ,AlipayService /PersonMsg(传递的对象实体)/IAlipayService/PersonMsg
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<PersonMsg> CREATOR = new Creator<PersonMsg>() { @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; } }
// 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.特别注意配置文件(见下图)
第三节 客户端(另一个APP)
注意点:PersonMsg.class,IAlipayService.aidl,PersonMsg.aidl全部从服务器端复制过来,文件路径一定和服务器端的路径一致。
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); } }
第四节 感想
多问几个为什么,然后去查百度,寻找自己可以理解的文章学习。