Android AIDL 的简单使用

  • 本文完整项目
  • 文档结构
  • 一端
  • 另一端
  • 实现思路
  • 成功截图

本文完整项目

链接:https://download.csdn.net/download/yancr/11082932

文档结构

一端

另一端

一端

// Person.aidlpackage com.ycr.aidlserver;parcelable Person;
// PersonManager.aidlpackage com.ycr.aidlserver;// Declare any non-default types here with import statements// int、long、char、boolean、double// String、CharSequence// List Map  must be ArrayList HashMap// Parcelableimport com.ycr.aidlserver.Person;interface PersonManager {     void add(in Person p);     List getList();}
<?xml version="1.0" encoding="utf-8"?>
package com.ycr.aidlserver;import android.os.Parcel;import android.os.Parcelable;public class Person implements Parcelable {private String name;public Person() {}public Person(String name) {this.name = name;}public String getName() {return name;}protected Person(Parcel in) {name = in.readString();}public static final Creator CREATOR = new Creator() {@Overridepublic Person createFromParcel(Parcel in) {return new Person(in);}@Overridepublic Person[] newArray(int size) {return new Person[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}}
package com.ycr.aidlserver;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import java.util.ArrayList;import java.util.List;public class PersonManageService extends Service {private ArrayList list;private final PersonManager.Stub personManager = new PersonManager.Stub() {@Overridepublic void add(Person p) throws RemoteException {synchronized (this) {if(list == null) {list = new ArrayList<>();}if(p == null) {p = new Person("default");}list.add(p);Log.e("aidlserver", p.getName());}}@Overridepublic List getList() throws RemoteException {return list;}};public PersonManageService() {}@Overridepublic void onCreate() {super.onCreate();Log.e("aidlserver", "PersonManageService onCreate");list = new ArrayList<>();}@Overridepublic IBinder onBind(Intent intent) {return personManager;}}

另一端

package com.ycr.aidlclient;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.ycr.aidlserver.Person;import com.ycr.aidlserver.PersonManager;import java.util.List;public class MainActivity extends AppCompatActivity {private Button addBtn, listBtn;private PersonManager personManager;private boolean connect = false;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {personManager = PersonManager.Stub.asInterface(service);connect = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {connect = false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setTitle("Client");Log.e("aidlclient", "MainActivity onCreate");addBtn = findViewById(R.id.addBtn);listBtn = findViewById(R.id.listBtn);Listener l = new Listener();addBtn.setOnClickListener(l);listBtn.setOnClickListener(l);Intent intent = new Intent();intent.setPackage(getString(R.string.server_package)); //此处 Package 取的是 Server的gradle中的 applicationIdintent.setAction(getString(R.string.server_action));boolean b = bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);Log.e("aidlclient", String.valueOf(b));}class Listener implements View.OnClickListener {@Overridepublic void onClick(View v) {if(v.equals(addBtn)) {if(connect) {Person p = new Person("Client");try {personManager.add(p);} catch (RemoteException e) {e.printStackTrace();}}} else if(v.equals(listBtn)) {try {List list = personManager.getList();StringBuilder stringBuilder = new StringBuilder();for(Person p : list) {stringBuilder.append(p.getName()).append('\t');}Toast.makeText(MainActivity.this, stringBuilder.toString(), Toast.LENGTH_SHORT).show();} catch (RemoteException e) {e.printStackTrace();}}}}@Overrideprotected void onDestroy() {super.onDestroy();Log.e("aidlclient", "MainActivity onDestroy");if(connect) {unbindService(serviceConnection);}}}

实现思路

使用 AIDL (Android 接口定义语言)定义两端通信的接口。此处为 PersonManager。

“另一端”通过该接口 bind “一端”的服务,并通过接口调用函数进行相关操作。

一些注意事项写在了注释中。文章中未列出的文件均无特殊修改。

成功截图

两次 add 之后 list

一端

更多相关文章

  1. Android(安卓)Retrofit 笔记之二配置通用接口
  2. 《android常用的API接口调用》
  3. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(4)
  4. Android(安卓)AudioManager控制系统声音的流程
  5. android 网络连接 HttpGet HttpPost方法
  6. Android(安卓)Retrofit 入门教程
  7. android http请求访问接口的封装
  8. Android(安卓)中使用MediaRecorder进行录像详解(视频录制)
  9. Android(安卓)camera 设置聚焦区域

随机推荐

  1. SQL Server数据库删除数据集中重复数据实
  2. sql server关键字详解大全(图文)
  3. SQL Server数据库按百分比查询出表中的记
  4. 企业管理器备份和还原SQL Server数据库
  5. sql分页查询几种写法
  6. SqlServer触发器详解
  7. 总结SQL执行进展优化方法
  8. 10种Java开发者编写SQL语句时常见错误
  9. SQL Server 2005数据库还原错误的经典解
  10. SQL Server数据库复制失败的原因及解决方