我正在尝试实现 AIDL,但我只是不明白它是如何工作的。我的意思是对方法的调用的进展是什么?
我不明白如何通过 AIDL 从服务获取对象到我的活动。我一直在使用谷歌文档寻求指导,但我很困惑。谢谢
更新:
在服务连接中,我有这些行,其中 mCallback 是 IRemoteServiceCallback。
public void onServiceConnected(ComponentName name, IBinder service) {
mRemoteInterface = IRemoteInterface.Stub.asInterface(service);
Log.v(TAG, "Interface bound.");
try{
mRemoteInterface.registerCallback(mCallback);
}catch(RemoteException e){
}
Toast.makeText(MainActivity.this, "Remote Service Connected",
Toast.LENGTH_SHORT).show();
}
这是 registerCallback,其中 mCallbacks 是
final RemoteCallbackList <IRemoteServiceCallback> mCallbacks
= new RemoteCallbackList <IRemoteServiceCallback> ();
......
public void registerCallback(IRemoteServiceCallback callback)
throws RemoteException {
if(callback != null){
mCallbacks.register(callback);
}
}
IRemoteServiceCallback(mCallback) 的唯一方法是:
public void valueChanged(int value) {
mHandler.sendMessage(mHandler.obtainMessage(BUMP_MSG, value, 0));
}
我也有一个处理程序,但我不太确定如何处理:
private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
case BUMP_MSG:
Log.d(TAG, "Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
};
更新 2:
AIDL 步骤-据我所知-。
我从 MainActivity 调用 bindService(service,connection,flags)
在我调用 bindService 并建立连接后,会自动调用 onServiceConnected。在那里,我得到了 IBinder,然后调用 registerCallback ,它放置了一个 IRemoteServiceCallback[ 这个回调来自哪里?] 进入 RemoteCallbackList 供以后访问
现在,我注意到有两个 mHandler,一个在服务中,一个在活动中。[什么时候调用它们,它们在使用方面有什么区别]
现在,RemoteCallbackList 有了我需要的回调,我可以看到在活动类的 mHandler 中我终于能够获得我想要的对象。