Я использую 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());
}
};
И это внутри моей Деятельности, которая пытается использовать и поговорить с сервисом:
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, кажутся никогда не вызываемыми; явно я что-то упускаю; есть мысли?
Большое спасибо!
Ива