文章最后提供源码
这个demo是在上一篇文章的基础上改进的,可以先学习
达内课程-AIDL(上)
AIDL接口中默认支持的数据类型有 1、除了short之外的基本数据类型 2、String和CharSequence 3、List和Map
void test(byte b,int i,long l,float f,double d,char c,boolean b2); void test(String s,CharSequence c); void test(in List list); void test(out List list); void test(inout List list); void test(inout Map map);如果需要在AIDL中使用自定义的数据类型,必须实现Parcelable接口
1、自定义类,实现Parcelable接口 2、创建Music.java对应的aidl文件,即Music.aidl,在Music.aidl中,使用与Music.java相同的package语句声明所在包,并使用parcelable Music;语法声明这是一个Parcelable类型的数据 3、在使用Music类型的aidl接口文件中,使用import语句显式的导包,导入Music类型,注意:无论aidl接口文件与Music是否在同一个包中,都必须导包 4、将服务端的aidl接口文件、Music的java文件、Music的aidl全部复制到客户端
例如,我们要支持自定义的Music类
IMusicPlayer.aidl
interface IMusicPlayer { void play(); void pause(); int getDuration(); Music getMusic(); }我们自定义一个Music类
import android.os.Parcel; import android.os.Parcelable; public class Music implements Parcelable{ public String title; public String artist; public int duration; //良好的编程习惯,增加无参构造方法 public Music() { } public Music(Parcel in) { this.title = in.readString(); this.artist = in.readString(); this.duration = in.readInt(); } public static final Parcelable.Creator<Music> CREATOR = new Parcelable.Creator<Music>(){ @Override public Music createFromParcel(Parcel parcel) { return new Music(parcel); } @Override public Music[] newArray(int i) { return new Music[i]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(title); parcel.writeString(artist); parcel.writeInt(duration); } }创建Music.aidl文件
package com.example.xx.serverproject; parcelable Music;sync project
在IMusicPlayer.aidl中,导包,导入Music.aidl
import com.example.xx.serverproject.Music; interface IMusicPlayer { void play(); void pause(); int getDuration(); Music getMusic(); }WorkService中重写新的方法
private class InnerBinder extends IMusicPlayer.Stub{ @Override public void play() throws RemoteException { Log.d("AIDL","[Server]WorkService$InnerBinder play()"); } @Override public void pause() throws RemoteException { Log.d("AIDL","[Server]WorkService$InnerBinder pause()"); } @Override public int getDuration() throws RemoteException { Log.d("AIDL","[Server]WorkService$InnerBinder getDuration()-->9527"); return 9527; } @Override public Music getMusic() throws RemoteException { Music music = new Music(); music.title = "SHEEP"; music.artist = "张艺兴"; music.duration = 205000; return music; } }把服务端安装到模拟机上
然后操作客户端 把ServerProject中的IMusicPlayer.aidl、Music.aidl、Music类复制到客户端
activity_main中增加1个按钮
...... <Button android:id="@+id/btn_getMusic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调用getGetMusic()方法" />MainActivity
private View btnGetMusic;//调用服务端的getMusic方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ...... btnGetMusic = findViewById(R.id.btn_getMusic); ...... btnGetMusic.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { ...... case R.id.btn_getMusic: try { Music music = player.getMusic(); Log.d("AIDL","[Client] getMusic()-->歌曲名:"+music.title+";演唱者:"+music.artist+";歌曲时长;"+music.duration); } catch (RemoteException e) { e.printStackTrace(); } break; default: break; }刨坑 如果运行时,报自定义的Music类找不到,解决办法可以参考以下文章 https://blog.csdn.net/u010356768/article/details/79876863
运行,点击绑定Service按钮,然后点击getMusic()方法的按钮 观察日志
D/AIDL: [Client] getMusic()-->歌曲名:SHEEP;演唱者:张艺兴;歌曲时长;205000https://download.csdn.net/download/u010356768/10337934
