Задать вопрос
Kavaru
@Kavaru

Как правильно запустить AndroidService из приложения на python?

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

В buildozer.spec сервис объявлен так:

services = chatmail_service:service/background_check.py


Код запуска:

def start_background_service(self):
        if platform != "android":
            logger.info(f"Background service is not started: platform={platform}")
            return

        if self.background_service is not None:
            logger.info("Background service is already started")
            return

        try:
            logger.info(f"Starting Android background service: platform={platform}")

            from android import AndroidService  # type: ignore

            self.background_service = AndroidService("ChatMail", "Проверка почты выполняется в фоне")
            logger.info(f"AndroidService object created: {self.background_service}")
            self.background_service.start()
            logger.info("Android background service start requested")

        except Exception as error:
            self.background_service = None
            logger.exception(f"Cannot start Android background service: {error}")


В логах вижу, что код запуска выполняется без ошибок, а код из service/background_check.py не вызывается.

Как правильно запустить сервис, чтобы при свернутом приложении появлялись уведомления о новом сообщении?
  • Вопрос задан
  • 25 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
тут не баг андроида, а перепутаны два механизма p4a. AndroidService(...).start() — старый способ под service/main.py, он вообще не трогает сервис из spec (services = chatmail_service:service/background_check.py). Именованный сервис p4a оборачивает в свой java-класс, стартовать его надо так:
from jnius import autoclass
activity = autoclass('org.kivy.android.PythonActivity').mActivity
autoclass(f'{activity.getPackageName()}.ServiceChatmail_service').start(activity, '')
. В spec допиши :foreground:foregroundServiceType=dataSync к services, разреши FOREGROUND_SERVICE, FOREGROUND_SERVICE_DATA_SYNC, POST_NOTIFICATIONS. На Android 15 у dataSync-сервиса лимит ~6ч в сутки — для вечного polling лучше WorkManager или push.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы