Что делает класс Binder? В чем смысл связывания? в ограниченных сервисах Android?
Я полностью запутался с Bounded Services. Мои вопросы:- В чем смысл Binding? Что делает класс Binder? Что означает возврат объекта iBinder из Служб? Что такое объект IBinder? Как работает метод onBind? Это несколько вопросов по ограниченным услугам. Пожалуйста, объясните мне подробно. Я уже прочитал документацию. Пока неясно.
2 ответа
Связанный сервис:
Связанный сервис - это сервис, который позволяет компонентам приложения связываться с ним, вызывая bindService() для создания долгосрочного соединения.
Создайте связанную службу, если вы хотите взаимодействовать со службой из действий и других компонентов в вашем приложении или предоставлять некоторые функции вашего приложения другим приложениям посредством межпроцессного взаимодействия (IPC).
Чтобы создать связанную службу, реализуйте метод обратного вызова onBind() для возврата IBinder, который определяет интерфейс для связи со службой. Другие компоненты приложения могут затем вызвать bindService(), чтобы получить интерфейс и начать вызывать методы службы. Служба живет только для обслуживания компонента приложения, который связан с ней, поэтому, когда нет никаких компонентов, связанных с услугой, система уничтожает ее. Вам не нужно останавливать связанную службу так же, как это необходимо при запуске службы с помощью onStartCommand ().
IBinder:
Чтобы создать связанную службу, вы должны определить интерфейс, который определяет, как клиент может взаимодействовать со службой. Этот интерфейс между службой и клиентом должен быть реализацией IBinder и должен возвращаться вашей службой из метода обратного вызова onBind(). После того как клиент получает IBinder, он может начать взаимодействовать со службой через этот интерфейс.
onBind():
Система вызывает этот метод, вызывая bindService(), когда другой компонент хочет связываться со службой (например, для выполнения RPC). В вашей реализации этого метода вы должны предоставить интерфейс, который клиенты используют для связи со службой, возвращая IBinder. Вы должны всегда реализовывать этот метод; однако, если вы не хотите разрешать привязку, вы должны вернуть null.
это пример работает как дополнение к ответу выше
- внутри вашего класса обслуживания инициализируйте интерфейс IBinder с объектом, созданным нашим внутренним классом (проверьте шаг 2)
- создать внутренний класс, расширяющий Binder , который имеет функцию получения, чтобы получить доступ к классу обслуживания
- в вашем классе обслуживания функция ovveride onBind и используйте ее для возврата экземпляра, созданного на шаге 1.
** Код очистит его для вас **
public class MyServiceClass extends Service {
//binder given to client
private final IBinder mBinder = new LocalBinder();
//our inner class
public LocalBinder extends Binder {
public MyServiceClass getService() {
return MyServiceClass.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public void doSomeWork(int time){ //we will call this function from outside, which is the whole idea of this **Binding**}
}
Следующий шаг — привязка себя
в вашем MainClass или где бы вы ни хотели привязать свой сервис,
Определяет обратные вызовы для привязки службы, передаваемые в bindService().
частное ServiceConnection serviceConnection = новое ServiceConnection(){
@Override public void onServiceConnected(ComponentName className, IBinder service) { MyServiceClass.LocalBinder binder =(MyServiceClass.LocalBinder)service; timerService = binder.getService(); } @Override public void onServiceDisconnected(ComponentName arg0) { //what to do if service diconnect }
};
момент привязки
Intent intent = new Intent(this, MyServiceClass.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
отвязать услугу
unbindService(serviceConnection);
- затем вы вызываете публичную функцию, которую мы создали ранее в классе Service, используя помощь [timerService = binder.getService();]
timerService.doSomeWork(50);