В документах для разработчиков для связанных служб приведен следующий пример кода для «Расширение класса Binder» в разделе «Создание связанной службы». Приведен следующий фрагмент кода (я удалил ненужные биты), в котором Service
возвращает IBinder
из своего onBind()
метода:
public class LocalService extends Service {
// Binder given to clients
private final IBinder mBinder = new LocalBinder();
...
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder; //**********************************************************
}
...
}
Затем в нашем клиенте мы получаем объект mBinder
(который является экземпляром LocalBinder
) в методе onServiceConnected()
объекта ServiceConnection
. Мой вопрос: почему мы пытаемся преобразовать экземпляр LocalBinder
, переданный как argument
в onServiceConnected()
, в экземпляр LocalBinder
в операторе LocalBinder binder = (LocalBinder) service;
?
public class BindingActivity extends Activity {
LocalService mService;
boolean mBound = false;
...
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
...
}