Во время разработки моего приложения 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 здесь.