Главная » Разработка для Android » Привязка Активностей к Сервисам

0

Если Активность связана с Сервисом, она может хранить у себя ссылку на экземпляр объекта Service, что позволяет  вызывать  методы работающего Сервиса, как в случае с экземпляром любого другого класса.

Подобного  рода привязка доступна для Активностей, которые выигры- вают от наличия  более основательного интерфейса для работы с Сервисом. Чтобы  поддерживать связь с Сервисом, реализуйте метод onBind,  как по- казано в листинге 9.5.

Листинг 9.5. Реализация привязки к Сервису

private final IBinder binder = new MyBinder();

@Override

public IBinder onBind(Intent intent) {

return binder;

}

public class MyBinder extends Binder { MyService getService() {

return MyService.this;

}

}

Связь между Сервисом и Активностью представлена классом ServiceCon- nection. Вам нужно реализовать новый класс ServiceConnection, переопреде- лив методы onServiceConnected и onServiceDisconnected, чтобы получить ссылку на экземпляр Сервиса при установлении связи, как показано  в ли- стинге 9.6.

Листинг 9.6. Привязка к Сервису

// Ссылка на Сервис

private MyService serviceBinder;

// Обработка связи между Сервисом и Активностью

private ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName className, IBinder service) {

// Вызывается при установлении связи.

serviceBinder = ((MyService.MyBinder)service).getService();

}

public void onServiceDisconnected(ComponentName className) {

// Вызывается при неожиданном разрыве связи. serviceBinder = null;

}

};

Для привязки вызовите метод bindService, передав в качестве параметров Намерение (явное  или неявное),  которое в свою очередь получит  нужный Сервис, а также реализацию ServiceConnection, как показано в следующем фрагменте, дополняющем листинг 9.6:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// Свяжите Активность с Сервисом

Intent bindIntent = new Intent(MyActivity.this, MyService.class);

bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);

}

Как только Сервис будет привязан, все его публичные методы и свойства станут доступными через объект serviceBinder, полученный в обработчике onServiceConnected.

Приложения в Android, как правило, не имеют общей памяти, но в не- которых случаях вашему приложению может потребоваться связаться с Сер- висами, работающими в процессах других приложений.

Вы можете установить  взаимодействие с Сервисами, функционирую- щими в других процессах,  с помощью передачи  Намерений или через до- полнительные параметры. Параметр Bundle в Намерении используется для запуска Сервиса. Если вам нужна более тесная связь, можете сделать Сервис доступным для привязки вне зависимости от приложения, используя AIDL. AIDL определяет интерфейс Сервиса на уровне операционной системы, по-

зволяя Android передавать объекты между процессами. Более подробно об

AIDL рассказывается в главе 15.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии