1 、在服务端定义一个回调的 aidl( 主要生成回调的 java 代码 )
// IMusicCallback.aidl
package com.xykj.musicserviceapp;
interface IMusicCallback {
void onDuration(int duration);
void onCurrentPosition(int pos);
}
2 、在功能 aidl 中新增关于回调对象的注册方法和取消注册方法
package com.xykj.musicserviceapp;
import com.xykj.musicserviceapp.Music;
import com.xykj.musicserviceapp.IMusicCallback;
interface IMusicInterface {
void initMusic(in Music music);
void start();
void pause();
Map getMusicInfo();
void registCallback(IMusicCallback callback);
void unRegistCallback(IMusicCallback callback);
}
3 、在服务 (Service) 中使用 RemoteCallbackList 管理回调对象,处理信息回调过程
// 远程回调集合
private RemoteCallbackList<IMusicCallback> callbackList;
...
@Override
public void onCreate() {
super.onCreate();
callbackList = new RemoteCallbackList<>();
}
...
处理回调对象的注册和取消注册
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
class MyBinder extends IMusicInterface.Stub {
...
@Override
public void registCallback(IMusicCallback callback) throws RemoteException {
callbackList.register(callback);
}
@Override
public void unRegistCallback(IMusicCallback callback) throws RemoteException {
callbackList.unregister(callback);
}
}
...
使用回调对象返回数据
private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
...
// 返回总时间
// 开始广播
int size = callbackList.beginBroadcast();
for (int i = 0; i < size; i++) {
try {
callbackList.getBroadcastItem(i).onDuration(duration);
} catch (RemoteException e) {
e.printStackTrace();
}
}
// 结束广播
callbackList.finishBroadcast();
...
}
};
客户端可以直接将服务端 aidl 生成的 Java 代码来实现回调对象,然后注册回调,不需要时取消注册回调即可
// 实现回调对象
private IMusicCallback callback = new IMusicCallback.Stub(){
@Override
public void onDuration(int duration) throws RemoteException {
mSeek.setMax(duration);
}
@Override
public void onCurrentPosition(int pos) throws RemoteException {
mSeek.setProgress(pos);
}
};
注册回调
iMusicInterface.registCallback(callback);
取消注册回调
iMusicInterface.unRegistCallback(callback);