AIDL可以发送基本数据、String、List、Map和实现Parcable接口的对象
一、创建AIDL文件和Service文件,目录结构如下:

二、AIDL文件
// IMyAidlInterface.aidlpackage com.mathias.hb.androidbasicknowledge;// Declare any non-default types here with import statementsinterface 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; } };}四、修改Androidmanifest.xml文件<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.aidlpackage com.mathias.hb.androidbasicknowledge;// Declare any non-default types here with import statementsimport com.mathias.hb.androidbasicknowledge.bean.Student;interface Student { Student getStudent();}剩下步骤与发送String、基本类型、List、Map类型数据相同
新闻热点
疑难解答