AIDL:Android Interface Definition Language
AIDL是为了实现进程间通信而设计的Android接口语言
Android进程间通信有多种方式,Binder机制是其中最常见的一种
AIDL的本质就是基于对Binder的运用从而实现进程间通信
这篇博文从实战出发,用一个尽可能精简的Demo,实现两个App(也是两个进程:服务端mainapp、客户端otherapp)通过AIDL的跨进程通信
一.创建两个App
按照下列步骤先创建两个App:
(1).新建一个开发文件夹(本Demo中命名为aidl-test)
(2).使用AndroidStudio在aidl-test文件夹下创建第一个Empty Activity的空App:mainapp
为了后续方便起见
创建完成后,把Studio默认创建的MainActivity.java名字改一下,改成MainAppActivty.java
(3).创建第二个Empty Activity的空App:otherapp
两个空App创建完成了:
二.在mainapp中创建一个Service
上一节中新建了两个空App:mainapp和otherapp
现在就先在mainapp中实现一个service
使用方便又快捷的studio创建MainAppService.java
可以看到新建的MainAppService会自动实现一个onBind(Intent intent)方法,这个方法后续我会在其中进行代码实现,它需要在其他进程连接到Service时,返回一个继承了android.os.Binder的对象
先在 MainAppActivity 和 MainAppService 中添加一些必要的生命周期函数代码
再在 MainAppService 中添加:
onBind(Intent intent):被客户端绑定时执行
onUnbind(Intent intent):被客户端解绑时执行
@com/android/mainapp/MainAppActivity.java
package com.android.mainapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainAppActivity extends AppCompatActivity {
private String TAG = "AIDL-MainAppActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate()");
setContentView(R.layout.activity_main);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy()");
}
}
@com/android/mainapp/MainAppService.java
package com.android.mainapp;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MainAppService extends Service {
private String TAG = "AIDL-MainAppService";
public MainAppService() {
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.v(TAG, "onStart()");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public boolean onUnbind(Intent intent) {
Log.v(TAG, "onUnbind()");
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy()");
}
}
三.mainapp中实现AIDL
依然使用方便又快捷的AndroidStudio在mainapp的main目录下创建一个名为IAppAidlInterface.aidl 的AIDL文件
AndroidStudio创建 IAppAidlInterface.aidl 会自动实现一个默认的可用于进程间传参通信的void basicTypes(...)函数,其参数是java的几种基础数据类型
除此之外,AI