AIDL: методы-заглушки не вызываются - PullRequest
1 голос
/ 03 мая 2010

Я использую 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, кажутся никогда не вызываемыми; явно я что-то упускаю; есть мысли?

Большое спасибо!

Ива

Ответы [ 3 ]

1 голос
/ 03 мая 2010

Без остатка вашего кода трудно ответить на ваш вопрос. См. здесь и здесь для пары примеров проектов, реализующих удаленный сервис и его клиента с использованием AIDL. Возможно, эти реализации дадут вам представление о том, где у вас что-то не так.

0 голосов
/ 23 августа 2017

Я сталкивался с той же ситуацией ранее сегодня. В моем случае у меня было две копии файла AIDL на стороне клиента и на стороне сервера.

Я обновлял файл AIDL на стороне клиента, но полностью забыл об обновлении AIDL на стороне сервера. Поскольку в реализации Stub нет проверки типов, он просто запускается, но ничего не возвращает.

0 голосов
/ 14 июня 2012

Вы должны указать свой класс в .aidl-файле, чтобы сделать его общедоступным для IPC.

См. http://fauxgrammer.com/?p=4 для получения дополнительной информации.

Ура!

...