Как создать сервис во Flutter, чтобы приложение всегда работало в фоновом режиме?

Я хотел бы, чтобы мое приложение Flutter работало всегда в фоновом режиме. С Android, мы должны создать сервис, который всегда работает в фоновом режиме. Я не нахожу что-то об услугах в документации Flutter.

Можно ли делать подобные вещи с Флаттером?

5 ответов

Решение

Сейчас нет способа сделать это напрямую из флаттера, хотя это может измениться в какой-то момент - см. Этот запрос об ошибке / функции. У вас есть несколько вариантов, хотя.

Во-первых, используйте MethodChannels и просто пишите код Android, который вы хотите создать фоновый сервис (или если вы хотите, чтобы он всегда был фоновым сервисом, вы, вероятно, можете сделать это без необходимости связи со стороны флаттера).

Вторым является некоторая комбинация этих двух плагинов - android_alarm_manager и android_intent. Но это не поможет для всех вариантов использования.

  • создать новый проект Flutter.
    • Создайте BroadcastReceiver класс рядом MainActivity в каталоге android.
    • менять MainActivity.java а также main.dart а также AndroidManifest.xml нравится

MyReceiver

    package com.example.flutter_broadcastreceiver_alarmmanager_repeat;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            MainActivity.callFlutter();
        }
    }

Основная деятельность

package com.example.flutter_broadcastreceiver_alarmmanager_repeat;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.view.FlutterView;

public class MainActivity extends FlutterActivity {

    private PendingIntent pendingIntent;
    private AlarmManager alarmManager;
    private static  FlutterView flutterView;
    private static final String CHANNEL = "com.tarazgroup";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        flutterView=getFlutterView();
        GeneratedPluginRegistrant.registerWith(this);

        Intent intent = new Intent(this, MyReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(this, 1019662, intent, 0);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000, pendingIntent);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        alarmManager.cancel(pendingIntent);
    }

    static void callFlutter(){
        MethodChannel methodChannel=new MethodChannel(flutterView, CHANNEL);
        methodChannel.invokeMethod("I say hello every minute!!","");
    }
}

main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  static const methodChannel = const MethodChannel('com.tarazgroup');

  _MyHomePageState() {
    methodChannel.setMethodCallHandler((call) {
      print(call.method);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
      ),
      body: Container() 
    );
  }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.flutter_broadcastreceiver_alarmmanager_repeat">

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="flutter_broadcastreceiver_alarmmanager_repeat">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:windowSoftInputMode="adjustResize">

            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".MyReceiver"></receiver>

    </application>

</manifest>

ваш код флаттера вызывает каждые 1 мин. даже ваше приложение свернуто, переключиться на другое приложение или выключить экран.

Это библиотека для работы с background_fetch.

Background Fetch - это очень простой плагин, который будит приложение в фоновом режиме примерно каждые 15 минут, обеспечивая короткий период фоновой работы. Этот плагин будет выполнять ваш предоставленный callbackFn всякий раз, когда происходит событие фоновой выборки. ссылка

flutter_background_service в сочетании с Timer из dart: as.

видеть :

Можно ли делать такие вещи с Flutter?

Да , теперь дротик может работать в фоновом режиме, запустив механизм флаттера в собственном сервисном компоненте Android. ( оригинальная ссылка )

ПРИМЕЧАНИЕ . Вы не можете заменить собственный сервисный компонент, предоставляемый Android. Вместо этого вы должны запустить двигатель флаттера в этом сервисном компоненте.

Вы можете сделать это вручную, как в этой статье: Ссылка на статью

Или

Вы можете использовать сторонние пакеты, например плагин Work Manager.

Другие вопросы по тегам