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

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

И… Я искал статьи, видео, вопросы и обнаружил отсутствие простых и понятных (по крайней мере, простого и понятного кода) примеров того, как этого добиться. Итак, после примерно 3 дней разочарования и удара лбом о стену (не совсем), я перепроектировал и объединил несколько из этих статей, видео, вопросов и получил следующий код, который я попытался сделать как можно более легким. Давайте начнем!

Внимание! На момент написания этой статьи я не являюсь разработчиком Kotlin/Java. У меня нет собственного опыта разработки (точнее, около 3 дней опыта Kotlin). Следующий контент может шокировать и беспокоить нативных разработчиков. Он может не иметь всей необходимой безопасности исключений. Я просто попытался показать самый простой пример. Но любые предложения в комментариях приветствуются!

Как и во всех настоящих кулинарных рецептах, я хотел бы начать с ингредиентов (TL;DR), а затем кратко их объясню:

Добавьте эти две строки в файл <Your Project Folder>\android\app\src\main\AndroidManifest.xml:

Добавьте следующие два файла в папку <Your Project Folder>\android\app\src\main\kotlin\com\example\<your project name>, но отредактируйте первые строки, как я прокомментировал:

MainActivity.kt:

ПримерService.kt:

Далее идет файл main.dart для поддержки этого примера. Я только что создал образец проекта Flutter и отредактировал его:

Так что же здесь происходит? По сути, мы можем общаться с кодом Kotlin из Dart, используя MethodChannel, который мы определяем в MainActivity.kt. Как только метод выполняет свою работу, мы отвечаем на наш код Dart, используя return.success(), и обрабатываем результат в Dart. В моем примере мы определяем необходимые методы для запуска и остановки нашего Сервиса.

Что такое Сервис? В Android это часть логики приложения, некий процесс, который может работать в фоновом режиме, даже если приложение закрыто. И из-за того, что мы используем уведомление переднего плана, Android не должен останавливать его сам по себе, если только пользователь не остановит приложение принудительно. В моем примере мы определяем Службу, которая создает NotificationChannel, если мы используем Android Oreo или более позднюю версию, запускает текущее уведомление переднего плана и обновляет текст в нем через 5 секунд с момента запуска Службы (вы можете остановить процесс раньше).

Вот оно! Я надеюсь, что его примера достаточно, чтобы объяснить основные концепции, поэтому вы можете начать отсюда, изучить другие концепции и реализовать необходимую функцию в своем приложении. Спасибо за чтение!

Вы можете найти весь пример проекта на GitHub здесь.
Только отредактированные файлы Gist здесь.