Flutter и сервисы
Как взаимодействовать с Сервисами в android? Хм….
Все в одном ресурсе Flutter: https://flatteredwithflutter.com/flutter-and-services/
Начать…
Хотя Flutter довольно мощный, иногда вам нужно взаимодействовать с вещами, зависящими от платформы ...
В этой статье рассказывается, как получить данные из Служб Android…
Примечание. Этот код несовместим с iOS…
Что такое услуги?
Service
- это компонент приложения, который может выполнять длительные операции в фоновом режиме и не имеет пользовательского интерфейса. Например, служба может обрабатывать сетевые транзакции, воспроизводить музыку, выполнять файловый ввод-вывод или взаимодействовать с поставщиком содержимого в фоновом режиме.
Запущенная служба:
Запущенная служба - это служба, которую другой компонент запускает, вызывая startService()
, что приводит к вызову метода onStartCommand()
службы.
Когда служба запускается, ее жизненный цикл не зависит от компонента, который ее запустил. Служба может работать в фоновом режиме неограниченное время, даже если компонент, запустивший ее, будет уничтожен. Таким образом, служба должна останавливаться, когда ее работа завершена, вызывая stopSelf()
, или другой компонент может остановить ее, вызвав stopService()
.
Создание службы… ..
- Откройте проект Flutter в Android Studio….
2. Создать сервис в Android Studio…
Это позаботится о добавлении службы в Android Manifest.xml….
Примечание. Здесь мы выберем Службу…
3. В onStartCommand мы можем реализовать нашу собственную логику .. В нашем случае мы добавили следующий код:
MyThread myThread = new MyThread(); myThread.start();
Ниже приведен код класса MyThread:
public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 1; i++) { try { Thread.sleep(500); Intent intent = new Intent(); intent.setAction(MY_ACTION); intent.putExtra("DATAPASSED", i); _currentValue = i; sendBroadcast(intent); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } stopSelf(); } }
На заметку:
- Значение передается обратно через намерение с использованием ключа как «DATAPASSED».
- По завершении логики вызывается stopSelf…
- Мы использовали intent.setAction () [который устанавливает общее действие, которое будет выполнено, для использования BroadCast Receiver]
Получить данные в Activity from Service….
- Создайте BroadcastReceiver в классе активности как:
private class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { int datapassed = arg1.getIntExtra("DATAPASSED", 0); Toast.makeText(MainActivity.this, "Value from service !!\n" + "Data passed: " + String.valueOf(datapassed), Toast.LENGTH_LONG).show(); } }
На заметку:
- При расширении класса до BroadcastReceiver нам необходимо реализовать onReceive.
- Мы получаем намерение как «DATAPASSED» и значение как int (как мы определили в Службе (см. Раздел выше))
2. Зарегистрируйте BroadCastReceiver в onStart как:
myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(SimpleService.MY_ACTION); registerReceiver(myReceiver, intentFilter);
3. Отмените регистрацию BroadCastReceiver в onStop как:
if (myReceiver != null) { unregisterReceiver(myReceiver); }
Введите Flutter…
Нам нужен механизм для вызова сервиса из Flutter… ..
- Измените MainActivity, чтобы реализовать MethodChannel…
public class MainActivity extends FlutterActivity implements MethodChannel.MethodCallHandler
2. Переопределите метод onMethodCall и внесите изменения как :
@Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { try { if (call.method.equals("connect")) { connectToService(); keepResult = result; } else if (serviceConnected) { if (call.method.equals("start")) { String _data = SimpleService.helloFromService(); result.success(_data); } } else { result.error(null, "App not connected to service", null); } } catch (Exception e) { result.error(null, e.getMessage(), null); } }
На заметку:
- Мы предоставляем фреймворку Flutter методы «connect» и «start».
- При вызове «connect» вызывается функция connectToService, которая активирует службу (Создано выше)….
private void connectToService() { if (!serviceConnected) { Intent service = new Intent(this, SimpleService.class); startService(service); serviceConnected = true; } else { if (keepResult != null) { keepResult.success(null); keepResult = null; } } }
- Это вызывает startService (), который важен для запуска службы…
3. В onCreate MainActivity включите следующую строку:
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(this::onMethodCall);
4. Важные переменные:
static final String TAG = "Main Activity....."; static final String CHANNEL = "com.example.services_demo/service"; MyReceiver myReceiver; MethodChannel.Result keepResult = null; boolean serviceConnected = false;
На заметку:
- Значение переменной CHANNEL должно быть таким же во Flutter (см. Ниже).
- Этот КАНАЛ регистрирует собственный код Android с помощью Flutter…
Сторона дротика / флаттера:
- Инициализировать переменную платформы как
static const platform = MethodChannel('com.example.services_demo/service');
Примечание. Это значение совпадает с значением переменной CHANNEL (см. выше)…
2. В initState
@override void initState() { super.initState(); connectToService(); }
и внутри connectToService,
Future<void> connectToService() async { try { await platform.invokeMethod<void>('connect'); print('Connected to service'); } on Exception catch (e) { print(e.toString()); } }
Примечание. «connect» - это то же значение, что и объявлено в MainActivity ‘OnMethodCall.
3. После того, как мы успешно подключились к сервису, теперь мы можем получать от него любые данные…
Future<String> getDataFromService() async { try { final result = await platform.invokeMethod<String>('start'); return result; } on PlatformException catch (e) { print(e.toString()); } return 'No Data From Service'; }
Примечание. «start» - это то же значение, что и объявлено в MainActivity ‘OnMethodCall.
Статьи, связанные с Flutter:
Исходный код: https://github.com/AseemWangoo/services_demo