0

В «developer docs for Bound Services» приведен следующий пример кода «Расширение класса связующего» в разделе «Создание связанной службы». Следующий фрагмент кода (я удалил ненужные биты) дается в котором Service возвращает IBinder из его onBind() метода:Android Bound Services: Почему мы приводим этот экземпляр IBinder в экземпляр IBinder?

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; 
     } 
    }; 
    ... 
} 

ответ

3

Определение ServiceConnection.onServiceConnected() является

общественного недействительными onServiceConnected (ComponentName имя класса, IBinder служба)

Обратите внимание, что параметр является IBinder - ServiceConnection не знает, какие услуги или какой вид IBinder реализация сервиса возвращается - только вы знаете это, поэтому почему вам нужно отдать ее правильному типу.

2

Потому что только информация о типе у вас есть в onServiceConnected является то, что вы получаете объект типа IBinder. IBinder s не имеют метода getService, поэтому вы должны выполнить листинг объекта IBinder объекту типа LocalBinder. Затем вы можете вызвать метод getService . Так работает статическая печать.

+0

«Язык статически типизирован, если тип переменной известен во время компиляции. Это на практике означает, что вы, как программист, должны указать тип каждой переменной». [Ссылка] (http://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages) - Теперь я не мог понять, как это связано с статическая типизация. – Solace

+1

@Zarah т.к. разлив. Вы не используете динамические языки (просто не выполняете). Когда вы бросаете, вы говорите, что хотите переопределить информацию о типе, доступную во время компиляции, потому что вы знаете лучше. Вы динамичны. – dcow

+0

Большое спасибо. – Solace

 Смежные вопросы

  • Нет связанных вопросов^_^