Я получил активность и службу, привязанную.
Когда onServiceConnected вызывается в ServiceConnection, я делаю следующее:
mInterfaceObject = IInterface1.Stub.asInterface(arg1);
mInterfaceObject.register(mController);
Где mController:
private final IInterface2.Stub mController = new IInterface2.Stub() {
И IInterface1 и IInterface2 являются файлами AIDL.
Теперь проблема. При внедрении регистра в службе. Параметр будет равен нулю.
Что я делаю не так?
Eclipse автоматически добавляет следующий метод
@Override
public IBinder asBinder() {
return null;
};
Это испортило все общение. Этот метод нельзя переопределять.
Вот моя реализация сервиса. У меня есть 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);
}
Надеюсь, что это поможет вам.