web-dev-qa-db-fra.com

Comment créer un service dans Flutter pour qu'une application s'exécute toujours en arrière-plan?

Je souhaite que mon application Flutter soit toujours exécutée en arrière-plan. Avec Android, nous devons créer un service qui fonctionne toujours en arrière-plan. Je ne trouve pas quelque chose à propos des services dans la documentation de Flutter.

Est-il possible de faire ce genre de choses avec Flutter?

10
camilleB

Il n’existe pas de moyen de le faire directement à partir du flutter pour le moment bien que cela puisse changer à un moment donné - voir cette demande de bogue/fonctionnalité . Vous avez cependant quelques options.

La première consiste à utiliser MethodChannels et à écrire simplement le code Android vous voulez créer un service en arrière-plan (ou si vous voulez qu'il soit toujours un service en arrière-plan, vous pouvez probablement faire cela sans avoir besoin de communication du côté flottant).

La seconde est une combinaison de ces deux plugins - Android_alarm_manager et Android_intent . Mais cela ne va pas aider pour tous les cas d'utilisation.

6
rmtmckenzie
  • créer un nouveau projet Flutter.
    • créer BroadcastReceiver classe à côté de MainActivity dans Android dir.
    • changement MainActivity.Java et main.Dart et AndroidManifest.xml comme ça

Mon récepteur

    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();
        }
    }

Activité principale

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>

votre code de flutter appelle avery 1 min. même votre application minimisée ou basculez vers une autre application ou un écran éteint.

4
geeekfa