Android(安卓)AIDL 的简单使用
16lz
2021-01-24
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
一端
更多相关文章
- Android(安卓)Retrofit 笔记之二配置通用接口
- 《android常用的API接口调用》
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(4)
- Android(安卓)AudioManager控制系统声音的流程
- android 网络连接 HttpGet HttpPost方法
- Android(安卓)Retrofit 入门教程
- android http请求访问接口的封装
- Android(安卓)中使用MediaRecorder进行录像详解(视频录制)
- Android(安卓)camera 设置聚焦区域