23 January 2021
Широковещательные приемники прослушивают широковещательные сообщения системы. Примеры таких сообщений: низкий заряд батареи, нажата кнопка камеры, установлено новое приложение и т.д.
Помимо системных событий пользователь может создавать свои события, например, когда поток завершил вычисления или когда поток начал работу.
Широковещательный приемник — это объект класса BroadcastReceiver или одного из его подклассов. Самый главный метод этого класса — onReceive(), который вызывается, когда приемник получает сообщение.
Рассмотрим пример запуска службы на основании получения широковещательного сообщения — нажатия кнопки камеры. Приемник будет прослушивать сообщения, фильтр намерения будет установлен на действие Intent.ACTION_CAMERA_BUTTON, которое соответствует нажатию кнопки камеры.
Зарегистрировать приемник можно функцией registerReceiver(), а удалить приемник — функцией unregisterReceiver().
Итак, начнем создавать наше приложение. Код основной деятельности MainActivity представлен в файле MainActivity.java (листинг 1).
Листинг 1. Код основной деятельности (MainActivity.java)
package com.samples.my_receiver;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
public class MainActivity extends Activity {
// Создаем объект iReceiver класса MyReceiver
MyReceiver iReceiver = new MyReceiver();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Создаем фильтр намерения
IntentFilter iFilter =
new IntentFilter(Intent.ACTION_CAMERA_BUTTON);
// Добавляем действие в фильтр
iFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
// Регистрируем приемник
registerReceiver(iReceiver, iFilter);
}
@Override
protected void onDestroy() {
// Уничтожаем приемник при завершении приложения
unregisterReceiver(iReceiver);
super.onDestroy();
}
}
Разберемся, что есть что. Первым делом мы объявили объект iReceiver класса MyReceiver. Этот класс будет описан позже. Затем мы создали фильтр намерения:
IntentFilter iFilter = new IntentFilter(Intent.ACTION_CAMERA_BUTTON);
iFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
После этого нужно только зарегистрировать приемник с помощью registerReceiver(). Первый параметр — это сам приемник, второй — фильтр намерений:
registerReceiver(iReceiver, iFilter);
Теперь нужно создать класс MyReceiver. Как это сделать с помощью Eclipse, вы уже знаете, поэтому привожу сразу код класса (листинг 2).
Листинг 2. Код класса MyReceiver (файл MyReceiver.java)
package com.samples.my_receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
// Класс MyReceiver является расширением класса BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
// Переопределяем метод onReceive()
@Override
public void onReceive(Context rcvContext, Intent rcvIntent) {
String action = rcvIntent.getAction();
// Если действие = Intent.ACTION_CAMERA_BUTTON
if (action.equals(Intent.ACTION_CAMERA_BUTTON)) {
// то запускаем сервис MyService
rcvContext.startService(new Intent(rcvContext,
MyService.class));
}
}
}
Приемник анализирует полученное действие. Если нажата кнопка камеры, то будет запущен сервис (служба) MyService, описанный в файле MyService.java. Код этого файла представлен в листинге 3. Вам нужно изменить только первую строчку, она должна выглядеть так:
package com.samples.my_receiver;
В этой главе рассмотрели создание потоков, служб и широковещательных приемников. В следующей мы поговорим о создании анимации в Android-приложениях
Листинг 3. Файл MyService.java
package com.samples.my_first_service;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Service started...",
Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed...",
Toast.LENGTH_LONG).show();
}
}