Android:AIDL参数接收null

时间:2012-03-21 09:03:05

标签: android aidl

我收到了绑定的活动和服务。

当在ServiceConnection中调用onServiceConnected时,我会做下一件事:

mInterfaceObject = IInterface1.Stub.asInterface(arg1);

mInterfaceObject.register(mController);

mController是:

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

IInterface1和IInterface2都是AIDL文件。

现在问题。 在服务中执行寄存器。该参数将为null。

我做错了什么?

3 个答案:

答案 0 :(得分:6)

Eclipse自动添加了下一个方法

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

这搞砸了整个沟通。不应该覆盖此方法。

答案 1 :(得分:3)

这是我的服务实现。我有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);
}

希望这会帮助你。

答案 2 :(得分:0)

自动生成的具体类 ICallback.Default 也实现了 asBinder 并返回 null。

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

确保扩展 ICallback.Stub 而不是 ICallback.Default