我正在使用AIDL将对象从Activity传递到服务,并且我得到了一些奇怪的行为。根据我的理解,AIDL背后的想法是在.aidl文件中创建一个接口,然后android将(部分地)在动态生成的类中实现。 Android将创建一个名为Stub的抽象类,然后您需要实例化并添加您在.aidl接口中定义的方法的实现。一旦完成所有这些操作,就可以实例化远程服务,并且可以调用.aidl接口文件中声明的方法(并在Stub类的实例化中定义)。
这是我对这种机制如何工作的印象,但是当我尝试实现它时,我注意到我在Stub类中声明的方法的定义没有被运行;相反,正在运行的是IBinder.transct()
以下是我要做的事情的片段:
这是在我的服务中实现的:
public final INetService.Stub mBinder = new INetService.Stub() {
public void sendInteger(String ID, int data) throws RemoteException {
// TODO Auto-generated method stub
}
public void sendString(String ID, String data) throws RemoteException {
ServiceConnectionHandler connHandler = new ServiceConnectionHandler(ID, data);
}
public void sendObject(String ID, NetMessage data) throws RemoteException {
ServiceConnectionHandler connHandler = new ServiceConnectionHandler(ID, data.getData());
}
};
这是在我的Activity中,它试图使用并与服务交谈:
private INetService mService = null;
private NetServiceConnection conn = null;
class NetServiceConnection implements ServiceConnection
{
public void onServiceConnected(ComponentName name, IBinder service) {
mService = INetService.Stub.asInterface(service);
Log.d( "ADDERSERVICECLIENT","onServiceConnected" );
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
Log.d( "ADDERSERVICECLIENT","onServiceDisconnected" );
}
};
private void initService()
{
conn = new NetServiceConnection();
Intent i = new Intent();
i.setClassName( "framework.network", "framework.network.NetService" );
if (!bindService( i, conn, Context.BIND_AUTO_CREATE))
{
Toast.makeText(this, "bindService fails..", Toast.LENGTH_LONG).show();
}
}
....
mService.sendString((char)0, finalMessage);
INetService.Stub中定义的方法,如sendString,似乎永远不会被调用;很明显我错过了一些东西;有什么想法吗?
非常感谢!
伊娃
答案 0 :(得分:1)
答案 1 :(得分:0)
答案 2 :(得分:0)
我今天早些时候遇到过同样的情况。就我而言,我在客户端和服务器端有两份AIDL文件。
我在客户端更新了AIDL文件,但完全忘记了更新服务器端AIDL。由于没有对Stub实现进行类型检查,它只是运行但从未返回任何内容。