AIDL可以发送基本数据、String、List、Map和实现Parcable接口的对象
一、创建AIDL文件和Service文件,目录结构如下:
二、AIDL文件
// IMyAidlInterface.aidl
package com.mathias.hb.androidbasicknowledge;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
// 发送基本数据
int plus(int a, int b);
int reduce(int a,int b);
// 发送String
String getString();
// 发送List集合
List getList();
}
三、Service文件
package com.mathias.hb.androidbasicknowledge.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.mathias.hb.androidbasicknowledge.IMyAidlInterface;
import com.mathias.hb.androidbasicknowledge.bean.Student;
import java.util.ArrayList;
import java.util.List;
public class MyAIDLService extends Service {
static int binderId = 0;
List<Integer> list;
String str = "hello world";
Student student = new Student("Mathias","men",25);
public MyAIDLService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.v("MyAidlService","onCreate");
list = new ArrayList();
for (int i = 0;i < 5 ; i++){
list.add(i);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("MyAidlService","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) throws UnsupportedOperationException{
// TODO: Return the communication channel to the service.
Log.v("MyAidlService","onBind");
return binder;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v("MyAidlService","onDestory");
}
IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub()
{
@Override
public int plus(int a, int b) throws RemoteException {
return a + b;
}
@Override
public int reduce(int a, int b) throws RemoteException {
return a - b;
}
@Override
public String getString() throws RemoteException {
return str;
}
@Override
public List getList() throws RemoteException {
return list;
}
};
}
<service android:name=".service.MyAIDLService" android:process=":remote">
<intent-filter>
<action android:name="com.mathias.hb.androidbasicknowledge" />
</intent-filter>
</service>
此处一定要添加action
五、另一个进程
1、先将上一个进程中的AIDL文件包括完整包拷贝粘贴到aidl目录下
2、启动服务,交互
package com.mathias.hb.androidbasicknowledge;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private EditText et01;
private EditText et02;
private Intent serviceIntent;
private IMyAidlInterface myAidlService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et01 = (EditText) findViewById(R.id.et_num01);
et02 = (EditText) findViewById(R.id.et_num02);
}
public void bindService(View view){
serviceIntent = new Intent();
// 要启动的Service在AndroidManifest.xml文件中设置的action
serviceIntent.setAction("com.mathias.hb.androidbasicknowledge");
// 注意:在Android 5.0以后,启动另一个应用的Service时需要添加一下方法表示启动那个引用中的service
serviceIntent.setPackage("com.mathias.hb.androidbasicknowledge");
startService(serviceIntent);
bindService(serviceIntent,serviceConnection , Service.BIND_AUTO_CREATE);
}
public void unbindService(View view){
unbindService(serviceConnection);
stopService(serviceIntent);
}
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
/**
* 需要在gradle文件中添加一下代码才能找到这个类
* sourceSets{
* main{
* java.srcDirs = ['src/main/java','src/main/aidl']
* }
* }
*/
Log.i("MyAidlService", "连接Service 成功");
myAidlService = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
public void plus(View view){
int a = Integer.parseInt(et01.getText().toString());
int b = Integer.parseInt(et02.getText().toString());
try {
int num01 = myAidlService.plus(a,b);
Log.v("a + b = ",num01 +"");
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void reduce(View view){
int a = Integer.parseInt(et01.getText().toString());
int b = Integer.parseInt(et02.getText().toString());
int num02 = 0;
try {
num02 = myAidlService.reduce(a,b);
Log.v("a - b = ",num02 +"");
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void getListData(View view){
try {
List list = myAidlService.getList();
for (int i = 0; i < list.size();i++){
Log.v("listData",i + "");
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void getString(View view){
try {
Log.v("StringData", myAidlService.getString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
stopService(serviceIntent);
}
}
六、发送一个自定义对象
自定义类需要实现Parcelable接口,并且在相同的包下创建aidl文件
package com.mathias.hb.androidbasicknowledge.bean;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by HB on 2017/2/24.
*/
public class Student implements Parcelable{
String name;
String gender;
int age;
public Student(String name,String gender,int age){
this.name = name;
this.gender = gender;
this.age = age;
}
protected Student(Parcel in) {
name = in.readString();
gender = in.readString();
age = in.readInt();
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(gender);
dest.writeInt(age);
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setAge(int age) {
this.age = age;
}
}
Student.aidl文件内容
// Student.aidl
package com.mathias.hb.androidbasicknowledge;
// Declare any non-default types here with import statements
import com.mathias.hb.androidbasicknowledge.bean.Student;
interface Student {
Student getStudent();
}
剩下步骤与发送String、基本类型、List、Map类型数据相同