Flutter и сервисы

Как взаимодействовать с Сервисами в android? Хм….

Все в одном ресурсе Flutter: https://flatteredwithflutter.com/flutter-and-services/

Начать…

Хотя Flutter довольно мощный, иногда вам нужно взаимодействовать с вещами, зависящими от платформы ...

В этой статье рассказывается, как получить данные из Служб Android…

Примечание. Этот код несовместим с iOS…

Что такое услуги?

Service - это компонент приложения, который может выполнять длительные операции в фоновом режиме и не имеет пользовательского интерфейса. Например, служба может обрабатывать сетевые транзакции, воспроизводить музыку, выполнять файловый ввод-вывод или взаимодействовать с поставщиком содержимого в фоновом режиме.

Запущенная служба:

Запущенная служба - это служба, которую другой компонент запускает, вызывая startService(), что приводит к вызову метода onStartCommand() службы.



Когда служба запускается, ее жизненный цикл не зависит от компонента, который ее запустил. Служба может работать в фоновом режиме неограниченное время, даже если компонент, запустивший ее, будет уничтожен. Таким образом, служба должна останавливаться, когда ее работа завершена, вызывая stopSelf(), или другой компонент может остановить ее, вызвав stopService().

Создание службы… ..

  1. Откройте проект 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();
    }
}

На заметку:

  1. Значение передается обратно через намерение с использованием ключа как «DATAPASSED».
  2. По завершении логики вызывается stopSelf
  3. Мы использовали intent.setAction () [который устанавливает общее действие, которое будет выполнено, для использования BroadCast Receiver]

Получить данные в Activity from Service….

  1. Создайте 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… ..

  1. Измените 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…

Сторона дротика / флаттера:

  1. Инициализировать переменную платформы как
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