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?
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.
BroadcastReceiver
classe à côté de MainActivity
dans Android dir.MainActivity.Java
et main.Dart
et AndroidManifest.xml
comme çaMon 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.