Перейти к содержанию
Fire Monkey от А до Я
  • 0

Использование нативных LocalBroadcastManager и BroadcastReceiver


Pax Beach

Вопрос

Из PlatformSDK (PlatformSDKs\android-sdk-windows\sources\android-23\android\support\v4\content\) портировал в Delphi класс TJLocalBroadcastManager.

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

Во вложении сам класс, в своем приложении убедитесь, что в Target Platforms (Android) → Android → Libraries включена библиотека android-support-v4.dex.jar.

 

Прилагаю пример, для изучения и использования в работе, который демонстрирует работу обычного BroadcastReceiver и LocalBroadcastReceiver.

В примере демонстрируется работа сообщений в приложении и сервисе. Сначала делаем build проекта LBCRService, потом будет доступна возможность собрать LocalBCR.

Собираю в Berlin 10.1, но на младших версиях тоже должно работать, по крайней мере в Seatlle.

 

В реализации методов

    procedure RegisterReceiver();
    procedure UnRegisterReceiver();

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

 

 

Androidapi.JNI.LocalBroadcastManager.pas.zip

LocalBroadCastReceiver.zip

Изменено пользователем Pax Beach
дополнил решение
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
56 минут назад, x11 сказал:

Подскажите, что нужно изменить в Ваших примерах, чтобы реагировать не на внутренние сообщения, а на внешние? Например, на звонки.

В коде есть комментарии на русском языке голубым по синему:

// Глобальные сообщения

и

// Локальные сообщения
 

соответственно то, что ниже этих комментариев, относится к локальному или глобальному ресиверу.

 

Ссылка на комментарий
  • 0

Подскажите, в чем может быть причина?

При запущенном приложении и службе работает Broadcast reciever (он внутри службы). И успешно получается перехватывать события, т.е. BroadcastReceiver.OnReceive срабатывает.

Как только закрываю приложение (смахиваю его с экрана), чтобы служба осталась работать, сразу Broadcast reciever ничего не ловит. Хотя вижу, что служба работает, в логах нет ничего связанного с удалением Broadcast reciever.

И даже вижу, что само приложение потом Андроидом запускается.

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

Ссылка на комментарий
  • 0

Нашёл в логах андроида при смахивании приложения с экрана:

Цитата

ActivityManager: Scheduling restart of crashed service имя.пакета.программы/com.embarcadero.services.имя_службы in 3924ms

Т.е. служба почему-то закрывается аварийно.

 

Broadcast reciever создавался в событии StartCommand, продублировал ещё и в OnCreate DataModule.

Изменено пользователем x11
Ссылка на комментарий
  • 0
3 часа назад, x11 сказал:

Нашёл в логах андроида при смахивании приложения с экрана:

Т.е. служба почему-то закрывается аварийно.

 

Broadcast reciever создавался в событии StartCommand, продублировал ещё и в OnCreate DataModule.

Как обычно — причин может быть много.

Здесь читающих мысли и чужой код из астрала не встречал, нужно код смотреть.

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

Ссылка на комментарий
  • 0
  • Модераторы
7 часов назад, x11 сказал:

Т.е. служба почему-то закрывается аварийно.

емба сломала это еще в Берлине, в Токио не починили.

Службы "нормально" работают только в Сиетле

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...