Приемник вещания Android не работает

Обновлено: 13.08.2022

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

Содержание

Обзор целей трансляции

Намерения широковещательной рассылки — это объекты Intent, которые передаются посредством вызова методов sendBroadcast(), sendStickyBroadcast() или sendOrderedBroadcast() класса Activity (последний используется, когда требуются результаты трансляции). В дополнение к системе обмена сообщениями и событиями между компонентами приложения широковещательные намерения также используются системой Android для уведомления заинтересованных приложений о ключевых системных событиях (например, о подключении или отключении внешнего источника питания или наушников).

При создании широковещательного намерения оно должно включать строку действия в дополнение к необязательным данным и строке категории. Как и в случае со стандартными намерениями, данные добавляются к широковещательному намерению с использованием пар ключ-значение в сочетании с методом putExtra() объекта намерения. Необязательная строка категории может быть назначена широковещательному намерению посредством вызова метода addCategory().

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

Приведенный выше код успешно запустит соответствующий широковещательный приемник на устройстве с версией Android ниже 3.0. Однако в более поздних версиях Android намерение не будет получено приемником вещания. Это связано с тем, что в Android 3.0 введена мера безопасности управления запуском, которая предотвращает запуск компонентов остановленных приложений с помощью намерения. Приложение считается остановленным, если оно либо только что было установлено и не запускалось ранее, либо было остановлено пользователем вручную с помощью диспетчера приложений на устройстве. Однако, чтобы обойти это, к намерению можно добавить флаг перед его отправкой, чтобы указать, что намерению разрешено запускать компонент остановленного приложения. Этот флаг FLAG_INCLUDE_STOPPED_PACKAGES и будет использоваться, как описано в следующей адаптации предыдущего фрагмента кода:


сообщить об этом объявлении

Обзор широковещательных приемников

Приложение прослушивает определенные намерения широковещательной рассылки, регистрируя широковещательный приемник. Широковещательные приемники реализованы путем расширения класса Android BroadcastReceiver и переопределения метода onReceive(). Затем широковещательный приемник может быть зарегистрирован либо в коде (например, в рамках действия), либо в файле манифеста. Часть реализации регистрации включает создание фильтров намерений для указания конкретных широковещательных намерений, которые приемник должен прослушивать. Это достигается путем ссылки на строку действия широковещательного намерения. Когда обнаружена совпадающая широковещательная рассылка, вызывается метод onReceive() приемника широковещательной рассылки, после чего у метода есть 5 секунд на выполнение любых необходимых задач перед возвратом. Важно отметить, что широковещательный приемник не обязательно должен работать все время. В случае обнаружения совпадающего намерения исполняющая система Android автоматически запускает широковещательный приемник перед вызовом метода onReceive().

Следующий код описывает шаблон подкласса широковещательного приемника:

При регистрации широковещательного приемника в файле манифеста для получателя необходимо добавить запись .

В следующем примере файла манифеста регистрируется приведенный выше пример широковещательного приемника:

При работе в версиях Android старше Android 8.0 фильтры намерений, связанные с получателем, можно поместить в элемент получателя файла манифеста следующим образом:

В Android 8.0 или более поздней версии получатель должен быть зарегистрирован в коде с помощью метода registerReceiver() класса Activity вместе с соответствующим образом настроенным объектом IntentFilter:

Когда широковещательный приемник, зарегистрированный в коде, больше не требуется, его можно отменить, вызвав метод unregisterReceiver() класса активности, передав ссылку на объект приемника в качестве аргумента. Например, следующий код отменит регистрацию указанного выше широковещательного приемника:

Важно помнить, что некоторые широковещательные намерения системы могут быть обнаружены получателем широковещательной рассылки только в том случае, если он зарегистрирован в коде, а не в файле манифеста.Ознакомьтесь с документацией по классу Android Intent для получения подробного обзора намерений широковещательной передачи системы и соответствующих требований в Интернете по адресу:

Получение результатов трансляции

Когда широковещательное намерение отправляется с помощью метода sendBroadcast(), инициирующее действие не может получить результаты от каких-либо широковещательных приемников, принимающих широковещательную рассылку. В случае, если требуется возврат результатов, вместо этого необходимо использовать метод sendOrderedBroadcast(). Когда широковещательное намерение отправляется с использованием этого метода, оно доставляется в последовательном порядке каждому получателю широковещательной рассылки с зарегистрированным интересом.

Метод sendOrderedBroadcast() вызывается с рядом аргументов, включая ссылку на другой широковещательный получатель (известный как получатель результата), который должен быть уведомлен, когда все остальные широковещательные получатели обработали намерение, вместе с набором ссылок на данные, в которые эти получатели могут помещать данные результатов. Когда всем получателям вещания предоставлена ​​возможность обрабатывать вещание, вызывается метод onReceive() получателя результата и передаются данные результата.

Закрепленные намерения трансляции

По умолчанию намерения широковещательной рассылки исчезают после того, как они были отправлены и обработаны любым заинтересованным получателем широковещательной рассылки. Однако широковещательное намерение может быть определено как «липкое». Закрепленное намерение и содержащиеся в нем данные остаются в системе после его завершения. Данные, хранящиеся в липком широковещательном намерении, могут быть получены через возвращаемое значение вызова метода registerReceiver() с использованием обычных аргументов (ссылки на широковещательный приемник и объект фильтра намерения). Многие из системных трансляций Android являются постоянными, ярким примером являются трансляции, касающиеся уровня заряда батареи.

Прилепленную трансляцию можно удалить в любое время с помощью вызова метода removeStickyBroadcast(), передав в качестве аргумента ссылку на намерение трансляции, которое нужно удалить.

Пример широковещательного намерения

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

Создание примера приложения

На экране форм-факторов включите параметр «Телефон и планшет» и установите для минимального параметра SDK значение API 26: Android 8.0 (Oreo). Продолжайте работать с экранами, запрашивая создание Пустого действия с именем SendBroadcastActivity с соответствующим файлом ресурсов макета с именем activity_send_broadcast.

После создания нового проекта найдите и загрузите файл макета activity_send_broadcast.xml, расположенный в окне инструмента "Проект" в разделе app -> res -> layout, и с помощью инструмента "Редактор макетов" в режиме "Дизайн" замените объект TextView на представление «Кнопка» и задайте свойство text так, чтобы оно читалось как «Отправить широковещательную рассылку». После установки текстового значения выполните обычные действия, чтобы извлечь строку в ресурс с именем send_broadcast.

Выбрав в макете кнопку, найдите свойство onClick на панели Атрибуты и настройте его для вызова метода с именем BroadIntent.

Создание и отправка трансляции

Создав структуру для приложения SendBroadcast, пришло время реализовать код для отправки широковещательного намерения. Это включает в себя реализацию метода BroadIntent(), указанного ранее в качестве цели onClick представления Button в пользовательском интерфейсе. Найдите и дважды щелкните файл SendBroadcastActivity.java и измените его, чтобы добавить код для создания и отправки широковещательного намерения. После изменения исходный код для этого класса должен выглядеть следующим образом:

Вы читаете пример главы из Android Studio 3.2 Edition этой книги.

Купите полностью обновленную версию этой публикации Android Studio Bumble Bee Edition в электронной книге (29,99 долл. США) или в печатном формате (46,99 долларов США)

На этом создание приложения для отправки широковещательного намерения завершено. Осталось только создать соответствующий широковещательный приемник.

Создание широковещательного приемника

Для создания широковещательного приемника необходимо создать новый класс, который является подклассом надкласса BroadcastReceiver. В окне инструмента Project перейдите к app -> java и щелкните правой кнопкой мыши имя пакета. В появившемся меню выберите пункт меню New -> Other -> Broadcast Receiver, назовите класс MyReceiver и убедитесь, что выбраны параметры Exported и Enabled.Эти настройки позволяют системе Android запускать приемник, когда это необходимо, и гарантируют, что класс может получать сообщения, отправленные другими приложениями на устройстве. Настроив класс, нажмите «Готово».

После создания Android Studio автоматически загрузит новый файл класса MyReceiver.java в редактор, где он должен выглядеть следующим образом:

Как видно из кода, Android Studio создала шаблон для нового класса и заглушку для метода onReceive(). Теперь необходимо внести ряд изменений в класс, чтобы реализовать требуемое поведение. Таким образом, оставшийся в файле MyReceiver.java измените код, чтобы он читался следующим образом:

Код для широковещательного приемника готов.

Регистрация широковещательного приемника

Проект должен сообщать о присутствии приемника вещания и должен включать фильтр намерений, чтобы указать намерения вещания, в которых заинтересован приемник. Когда класс BroadcastReceiver был создан в предыдущем разделе, Android Studio автоматически добавила элемент в файл манифеста. Таким образом, остается только добавить код в файл SendBroadcastActivity.java, чтобы создать фильтр намерений и зарегистрировать получателя:

Также важно отменить регистрацию широковещательного приемника, когда он больше не нужен:

Тестирование примера трансляции

Чтобы проверить отправителя и получателя широковещательной рассылки, запустите приложение SendBroadcast на устройстве или AVD и подождите, пока оно не появится на дисплее. После запуска коснитесь кнопки, после чего появится всплывающее сообщение с надписью «Обнаружено широковещательное намерение». должен появиться на несколько секунд, прежде чем исчезнуть.

Прослушивание системных трансляций

Заключительный этап этого примера — изменить фильтр намерений для приемника широковещательной рассылки, чтобы он также прослушивал системные намерения, которые транслируются при отключении внешнего питания от устройства. Это действие android.intent.action.ACTION_POWER_DISCONNECTED. Измените метод onCreate() в файле SendBroadcastActivity.java, чтобы добавить этот дополнительный фильтр:

Поскольку метод onReceive() теперь будет прослушивать два типа широковещательных намерений, стоит изменить код, чтобы строка действия текущего намерения также отображалась во всплывающем сообщении. Эту строку можно получить с помощью вызова метода getAction() объекта намерения, переданного в качестве аргумента методу onReceive():

Протестируйте приемник, переустановив модифицированный пакет BroadcastReceiver. Прикосновение к кнопке в приложении SendBroadcast теперь должно приводить к появлению нового сообщения, содержащего строку пользовательского действия:

Затем отсоедините USB-разъем, который в данный момент подает питание на устройство Android, после чего получатель должен сообщить следующее во всплывающем сообщении. Если приложение работает на эмуляторе, отобразите расширенные элементы управления, выберите параметр «Батарея» и измените настройку подключения к зарядному устройству на «Нет».

Чтобы это сообщение не появлялось каждый раз, когда устройство отключается от источника питания, запустите приложение "Настройки" на устройстве и выберите параметр "Приложения и уведомления". Выберите приложение BroadcastReceiver из полученного списка и нажмите кнопку «Удалить».

Обзор

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

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

Вы читаете пример главы из Android Studio 3.2 Edition этой книги.

Купите полностью обновленную версию этой публикации Android Studio Bumble Bee Edition в электронной книге (29,99 долл. США) или в печатном формате (46,99 долларов США)

В некоторых случаях может потребоваться создать широковещательный приемник, который сможет работать в фоновом режиме после выхода из приложения для Android. Этот пример просто расскажет вам, как это сделать, используя широковещательный приемник и объект службы Android.

1. Экран Вкл. Выкл. Широковещательный приемник.

  1. Ниже приведены примеры файлов, используемых в проекте.
  2. Сначала мы создадим широковещательный приемник, который сможет прослушивать и обрабатывать события включения/выключения экрана Android, как показано ниже.
  3. Как видите, мы проверим значение широковещательного действия и зарегистрируем отладочное сообщение на основе этого значения в методе onReceive() широковещательного приемника.
  4. ScreenOnOffReceiver.java

2. Регистрация и отмена регистрации ScreenOnOffReceiver в действии.

  1. Теперь мы создадим действие и зарегистрируем объект ScreenOnOffReceiver в его методе onCreate() и отменим регистрацию получателя в его методе onDestroy(), как показано ниже.
  2. ScreenOnOffActivity.java
  3. Ниже представлен XML-файл макета для описанного выше действия.
  4. activity_screen_on_off.xml
  5. Выполните указанное выше действие, выполнив указанные ниже действия.
  6. Запустите действие, в журнале появится сообщение о том, что приемник широковещательной рассылки зарегистрирован в методе действия onCreate().
  7. Нажмите кнопку питания, чтобы выключить экран.
  8. Нажмите кнопку питания еще раз, чтобы включить экран.
  9. Вы можете просмотреть данные журнала для вышеуказанных шагов в консоли монитора Android.
  10. Введите меню «Назад», чтобы выйти из действия. Вы также можете видеть, что широковещательный приемник не зарегистрирован в методе onDestroy() активности.
  11. Нажмите кнопку питания, чтобы снова выполнить шаги 2 и 3, но данные журнала не будут напечатаны в консоли монитора Android.

3. Регистрация и отмена регистрации широковещательного приемника в фоновой службе Android.

  1. При регистрации широковещательного приемника в классе активности Android он будет остановлен после выхода из активности.
  2. Чтобы решить эту проблему, мы создадим объект службы Android, а также зарегистрируем и отменим регистрацию приемника широковещательной рассылки в объекте службы.
  3. Поскольку объект службы Android будет по-прежнему работать в фоновом режиме после выхода из активности, поэтому приемник широковещательной рассылки будет по-прежнему работать после выхода из приложения Android.

3.1. Создание класса обслуживания Android.

3.1.1 Создание класса Java, расширяющего android.app.Service.
  1. ScreenOnOffBackgroundService.java
3.1.2. Добавление тега Xml службы в файл AndroidManifest.xml.
3.1.3 Изменить код Java действия на приведенный ниже.
  1. Обратите внимание на код Java, который запускает объект службы.
  2. ScreenOnOffActivity.java
  3. Запустите пример еще раз, вы увидите рисунок ниже. Из выходных данных Android Logcat мы видим, что приемник вещания все еще работает после выхода из приложения Android.

Вещательные приемники для начинающих

Допустим, у вас есть приложение, для работы которого требуется стабильное подключение к Интернету. Вы хотите, чтобы ваше приложение получало уведомления при изменении подключения к Интернету. Как ты это делаешь? Возможным решением может быть служба, которая всегда проверяет интернет-соединение. Эта реализация плоха по разным причинам, поэтому мы даже не будем ее рассматривать. Решением этой проблемы является широковещательный приемник, и он будет прослушивать изменения, которые вы ему скажете. Получатель вещания всегда будет получать уведомления о вещании, независимо от статуса вашего приложения. Неважно, работает ли ваше приложение в данный момент, в фоновом режиме или вообще не работает.

Фон

Приемники широковещательных сообщений — это компоненты вашего приложения для Android, которые прослушивают широковещательные сообщения (или события) из разных источников:

  • Из других приложений
  • Из самой системы
  • Из вашего приложения

Это означает, что они вызываются, когда происходит определенное действие, которое они запрограммировали прослушивать (т.е. трансляция).

Рассылка — это просто сообщение, заключенное в объект Intent. Широковещательная рассылка может быть неявной или явной.

  • Неявная широковещательная рассылка — это трансляция, которая не нацелена конкретно на ваше приложение, поэтому она не является эксклюзивной для вашего приложения. Чтобы зарегистрироваться для него, вам нужно использовать IntentFilter и объявить его в своем манифесте. Вам нужно сделать все это, потому что операционная система Android просматривает все заявленные фильтры намерений в вашем манифесте и проверяет, есть ли совпадения. Из-за этого поведения неявные широковещательные рассылки не имеют целевого атрибута. Примером неявной трансляции может быть действие входящего SMS-сообщения.
  • Явная широковещательная рассылка предназначена специально для вашего приложения на известном заранее компоненте. Это происходит из-за целевого атрибута, который содержит имя пакета приложения или имя класса компонента.

Есть два способа объявить получателя:

  1. Объявляя его в файле AndroidManifest.xml с помощью тега (также называемого статическим)

Вы заметите, что объявленный выше широковещательный приемник имеет свойство exported="true".Этот атрибут сообщает получателю, что он может получать широковещательные сообщения из-за пределов области приложения.

<р>2. Или динамически путем регистрации экземпляра с помощью registerReceiver (так называемая регистрация контекста)

Реализация

Чтобы создать собственный широковещательный приемник, необходимо сначала расширить родительский класс BroadcastReceiver и переопределить обязательный метод onReceive:

Соединив все вместе, мы получим:

Если выполняется длительный процесс, система может завершить процесс после возврата из метода. Чтобы обойти это, рассмотрите возможность использования goAsync или планирования задания. Подробнее о планировании задания можно прочитать в конце этой статьи.

Пример динамической регистрации

Чтобы зарегистрировать приемник с контекстом, вам сначала нужно создать экземпляр вашего широковещательного приемника:

Затем вы можете зарегистрировать его в зависимости от желаемого контекста:

Первый параметр для IntentFilter — это строка, представляющая действие

Не забудьте отменить регистрацию вещательного приемника, когда он вам больше не нужен

Трансляция события

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

Есть три способа отправки трансляций:

  1. Метод sendOrderedBroadcast обеспечивает отправку широковещательных сообщений только одному получателю за раз. Каждая широковещательная рассылка может, в свою очередь, передавать данные следующей за ней или останавливать распространение широковещательной рассылки к последующим получателям.
  2. sendBroadcast похож на метод, упомянутый выше, с одним отличием. Все широковещательные приемники получают сообщение и не зависят друг от друга
  3. Метод LocalBroadcastManager.sendBroadcast отправляет широковещательные сообщения только получателям, определенным внутри вашего приложения, и не выходит за рамки вашего приложения. Пример отправки пользовательского широковещательного сообщения

Подсказки и вещи, на которые следует обратить внимание

  • Не отправляйте конфиденциальные данные через скрытую широковещательную рассылку, так как любое прослушивающее их приложение получит их. Вы можете предотвратить это, либо указав пакет, либо прикрепив разрешение к трансляции
  • Не начинайте действия с полученной трансляции, так как пользователь не может работать с ней. Вместо этого выберите отображение уведомления.

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

  • 7.0 и более поздние версии (уровень API 24) – отключены две системные трансляции: Action_New_Picture и Action_New_Video (но они были возвращены в Android O для зарегистрированных получателей).
  • 8.0 и выше (уровень API 26). Большинство неявных широковещательных сообщений необходимо регистрировать динамически, а не статически (в манифесте). Вы можете найти трансляции, которые были внесены в белый список, по этой ссылке.
  • 9.0 и более поздние версии (уровень API 28) — меньше информации, получаемой при широковещании системы Wi-Fi и Network_State_Changed_Action.

Вы должны быть в курсе изменений в Android O. Причина, по которой эти изменения были внесены, заключалась в том, что они приводили к проблемам с производительностью, разрядке батареи и ухудшению пользовательского опыта. Это произошло из-за того, что многие приложения (даже те, которые в данный момент не запущены) прослушивали системные изменения, и когда это изменение происходило, возникал хаос. Представьте, что каждое приложение, зарегистрированное на действие, оживает, чтобы проверить, нужно ли ему что-то делать из-за трансляции. Примите во внимание что-то вроде состояния Wi-Fi, которое часто меняется, и вы начнете понимать, почему произошли эти изменения.

Альтернативы широковещательным приемникам

Чтобы было проще ориентироваться во всех этих ограничениях, ниже приводится разбивка других компонентов, которые можно использовать при отсутствии приемника вещания. Каждый из них имеет свою ответственность и вариант использования, поэтому постарайтесь определить, какой из них соответствует вашим потребностям.

  • LocalBroadcastManager. Как я уже упоминал выше, это действительно только для широковещательных передач внутри вашего приложения.
  • Планирование задания. Задание может запускаться в зависимости от полученного сигнала или триггера, поэтому вы можете обнаружить, что трансляция, которую вы слушали, может быть заменена заданием. Кроме того, JobScheduler гарантирует, что ваша работа будет завершена, но он будет учитывать различные системные факторы (время и условия), чтобы определить, когда она должна выполняться. При создании задания вы переопределяете метод onStartJob.Этот метод работает в основном потоке, поэтому убедитесь, что он завершает свою работу за ограниченное время. Если вам нужно выполнить сложную логику, рассмотрите возможность запуска фоновой задачи. Кроме того, возвращаемое значение этого метода является логическим, где true означает, что определенные действия все еще выполняются, а false означает, что задание выполнено.

Если вы хотите лично испытать радость и удивление от приемников вещания, вы можете перейти по этим ссылкам на репозитории, которые я установил:

В соответствии с ограничениями фонового выполнения Android 8.0 (уровень API 26) приложения, предназначенные для API уровня 26 или выше, больше не могут регистрировать широковещательные приемники для неявных широковещательных передач в своем манифесте. Приложения могут продолжать регистрировать слушателей для следующих трансляций независимо от того, на какой уровень API нацелено приложение.

Как сбросить загрузочный приемник?

Чтобы перезагрузить приемник:

  1. Отключите шнур питания ресивера от задней панели ресивера или от настенной розетки.
  2. Оставьте устройство отключенным на 30 секунд и снова включите его.
  3. Приемник должен правильно загрузиться менее чем за 90 секунд.

Каковы методы жизненного цикла широковещательного приемника?

Объявите широковещательный приемник в манифесте, чтобы обеспечить для него независимый жизненный цикл. В жизненном цикле BroadcastReciver вызывается только метод onReceive(). Жизненный цикл BroadcastReciever заканчивается (т.е. прекращается получение широковещательной рассылки), когда вы отменяете его регистрацию. обычно это делается в методе onPause/onStop.

Почему мы используем широковещательный приемник в Android?

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

Возможно ли действие без пользовательского интерфейса для выполнения действий действия?

Пояснение. Как правило, каждое действие имеет свой пользовательский интерфейс (макет). Но если разработчик хочет создать активность без пользовательского интерфейса, он может это сделать.

Сколько типов потоков существует в Android?

Как запустить обработчик?

Вот фрагмент моего кода: handler = new Handler(); Runnable r = new Runnable() < public void run() < tv. добавить("Привет, мир"); >>; обработчик. postDelayed(r, 1000);

Для чего чаще всего используются обработчики?

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

Как вы выполняете задержку и периодически обрабатываете?

Существует как минимум четыре способа запуска периодических задач:

  1. Handler — выполнение задачи Runnable в UIThread после необязательной задержки.
  2. ScheduledThreadPoolExecutor — выполнение периодических задач с фоновым пулом потоков.
  3. AlarmManager — выполнение любой периодической задачи в фоновом режиме в качестве службы.

В каком потоке выполняется runnable обработчика?

Существует два основных способа использования обработчика: (1) для планирования сообщений и исполняемых модулей, которые должны быть выполнены в какой-то момент в будущем; и (2) поставить в очередь действие, которое будет выполняться в потоке, отличном от вашего собственного. Планирование сообщений выполняется с помощью post(Runnable), postAtTime(java….Handler.

Читайте также: