Как создать сервис во 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.