Android: параметр AIDL получает ноль

1

Я получил активность и службу, привязанную.

Когда onServiceConnected вызывается в ServiceConnection, я делаю следующее:

mInterfaceObject = IInterface1.Stub.asInterface(arg1);

mInterfaceObject.register(mController);

Где mController:

private final IInterface2.Stub mController = new IInterface2.Stub() {

И IInterface1 и IInterface2 являются файлами AIDL.

Теперь проблема. При внедрении регистра в службе. Параметр будет равен нулю.

Что я делаю не так?

Теги:
aidl

2 ответа

4
Лучший ответ

Eclipse автоматически добавляет следующий метод

    @Override
    public IBinder asBinder() {
        return null;
    };

Это испортило все общение. Этот метод нельзя переопределять.

2

Вот моя реализация сервиса. У меня есть 2 файла справки IService & IDataServiceCallback.

private ServiceConnection mConnection = new ServiceConnection()
{
    public void onServiceConnected(ComponentName className, IBinder service) 
    {
        serv = iService.Stub.asInterface((IBinder)service);

        try 
         {
               serv.registerCallback(mCallback); 
         } 
         catch (RemoteException e)
         {
             e.printStackTrace();
         }

    }

    public void onServiceDisconnected(ComponentName className) 
    {
        try 
        {
             serv.unregisterCallback(mCallback);
        } 
        catch(RemoteException e) 
        {
            e.printStackTrace();
        }
        serv = null;
    }
};

Вот моя часть mCallback.

private iDataServiceCallback mCallback = new iDataServiceCallback.Stub() 
{

    @Override
    public void updateResponse(String text) throws RemoteException 
    {
        // TODO Auto-generated method stub

        }

    @Override
    public void loginResponse(String text) throws RemoteException {
        // TODO Auto-generated method stub
        Message msg = Message.obtain();

        msg.obj = text;

        handler.sendMessage(msg);
    }


};

на стороне обслуживания я реализовал это.

@Override
public IBinder onBind(Intent arg) {
    // TODO Auto-generated method stub
    return mBinder;
}



private final iService.Stub mBinder = new iService.Stub()
{

    @Override
    public void registerCallback(iDataServiceCallback cb) throws RemoteException {
        // TODO Auto-generated method stub
        if (cb != null)
        {
            mCallbacks.register(cb);        
        }
    }

    @Override
    public void unregisterCallback(iDataServiceCallback cb) throws RemoteException {
        // TODO Auto-generated method stub

        if (cb != null) mCallbacks.unregister(cb);  

    }

Вот IService.aidl

package com.nishant.phototest;

import com.nishant.phototest.iDataServiceCallback;

interface iService
{
    void doLogin(String ip,String port);

    void updatePhoto(in byte[] data);

    void registerCallback(iDataServiceCallback cb); 

    void unregisterCallback(iDataServiceCallback cb);
}

Вот IDataServiceCallBack.aidl

package com.nishant.phototest;

oneway interface iDataServiceCallback
{
    void loginResponse(String text);

    void updateResponse(String text);
}

Надеюсь, что это поможет вам.

  • 0
    Спасибо за ваш пост, я получил почти то же самое. Но cb здесь будет нулевым. Не могли бы вы также опубликовать свой файл AIDL?
  • 0
    пожалуйста, проверьте файлы помощи.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню