ben*_*ill 2 java aidl android-service
我正在尝试实现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();
}
Run Code Online (Sandbox Code Playgroud)
这是registerCallback,其中mCallbacks是一个
final RemoteCallbackList <IRemoteServiceCallback> mCallbacks
= new RemoteCallbackList <IRemoteServiceCallback> ();
Run Code Online (Sandbox Code Playgroud)
.....
public void registerCallback(IRemoteServiceCallback callback)
throws RemoteException {
if(callback != null){
mCallbacks.register(callback);
}
}
Run Code Online (Sandbox Code Playgroud)
IRemoteServiceCallback(mCallback)的唯一方法是:
public void valueChanged(int value) {
mHandler.sendMessage(mHandler.obtainMessage(BUMP_MSG, value, 0));
}
Run Code Online (Sandbox Code Playgroud)
我也有一个处理程序,但我不太清楚该怎么做:
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);
}
}
};
Run Code Online (Sandbox Code Playgroud)
更新2:
AIDL步骤 - 从我的理解 - .
我从MainActivity调用bindService(service,connection,flags)
在调用bindService并建立连接后,将自动调用onServiceConnected.在那里,我得到IBinder,然后调用registerCallback,它放置一个IRemoteServiceCallback [ 这个CALLBACK来自哪里?]进入RemoteCallbackList以供以后访问
现在,我注意到有两个mHandler,一个在服务中,一个在活动中.[ 当这些被呼叫时,它们之间的区别在于它们的使用条件 ]
现在,RemoteCallbackList具有我需要的回调,我可以看到,在活动类的mHandler中,我能够最终得到我想要的对象.
Android中的跨应用程序服务基于Binder,这是一个内核级IPC系统(这是IBinder类名来源).绑定到远程服务(即应用程序外部的服务)时,它可以向您返回一个对象.但是,由于您不知道实际类型是什么(方法,字段等),因此无法将其转换为可用类型.
这就是AIDL的用武之地 - 它是一种与语言无关的指定接口的方式 - 方法及其参数的集合(它看起来也像Java一样 - 但事实并非如此).如果客户端和服务器都使用相同的.aidl文件,则可以通过生成的Java接口绑定到对象 - IRemoteService.Stub.asInterface(obj).在服务方面,你只需要用某种语言实现相同的接口(框架中的一些服务是用C++编写的),IPC机制将负责其余的工作.
也就是说,除非您导出服务并希望外部应用程序能够使用它,否则您不需要使用AIDL.如果没有,只需在您的应用程序中实现IBinder并onServiceConnected直接转换收到的对象,因为您知道它的类型.
| 归档时间: |
|
| 查看次数: |
1940 次 |
| 最近记录: |