Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a service in Flutter to make an app to run always in background?

I would like to make my Flutter application to run always in background. With android, we have to create a Service that runs always in background. I don't find something about Services in the Flutter documentation.

Is it possible to do this kind of things with Flutter?

like image 810
camilleB Avatar asked Apr 30 '18 19:04

camilleB


People also ask

How do I create a service in Flutter?

Getting started. Let's use the MediaService to fetch an image from the user's phone and displays it on the screen. The first thing is to create a new project. Next, import stacked and image_picker packages, which Flutter would use in the project in the dependencies section of the pubspec YAML.


Video Answer


2 Answers

There isn't a way to do this directly from flutter right now although that may change at some point - see this bug/feature request. You do have a couple of options though.

The first is to use MethodChannels and simply write the android code you want to create a background service (or if you want it to always be a background service you can probably do that without needing communication from the flutter side).

The second is some combination of these two plugins - android_alarm_manager and android_intent. But that won't help for all use-cases.

EDIT Feb 2021:

Flutter now supports running background processes. See this page for details.

like image 71
rmtmckenzie Avatar answered Sep 24 '22 20:09

rmtmckenzie


  • create new Flutter project.
    • create BroadcastReceiver class beside MainActivity in android dir.
    • change MainActivity.java and main.dart and AndroidManifest.xml like this

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

MainActivity

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> 

your flutter code calls avery 1 min. even your app minimized or switch to another app or screen off.

like image 31
geeekfa Avatar answered Sep 25 '22 20:09

geeekfa