6

I am facing issue received notifications when app terminated/Remove from recent apps from background.

I have complete all the setup required for android app in build.gradle files both app or project level. I am able to receive push notification when app is open or when app is in the recent apps.

Library versions

firebase_messaging: ^11.2.0
firebase_core: ^1.10.0
flutter_local_notifications: ^9.1.4

here is my code.

await Firebase.initializeApp();
    FirebaseMessaging messaging = FirebaseMessaging.instance;

    messaging.getToken().then((value) {
      print('firebase token =$value');    
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
      //print(event.notification!.body);
      RemoteNotification? notification = message.notification;
      if (notification != null) {
        print("Notification received when app in foreground");
      }
    });

    FirebaseMessaging.onMessageOpenedApp.listen((message) {
      print('Message clicked!');
    });

    await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );

BackgroundMessage handler code is below

Future<void> _messageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  RemoteNotification? notification = message.notification;
  if (notification != null) {
    print("Notification received when app in background");
  }
}

Below is my complete code of main.dart file

Future<void> _messageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  RemoteNotification? notification = message.notification;
  if (notification != null) {
    print("Notification received when app in background");
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(_messageHandler);
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isUserLoggedIn = true;
  bool isLogoutAlertShown = false;
  final materialAppKey = GlobalKey();
  late FirebaseMessaging messaging;


  @override
  void initState() {
    super.initState();
    setUpNotification();
  }

  setUpNotification() async {
    messaging = FirebaseMessaging.instance;
    messaging.getToken().then((value) {
      print('firebase token =$value');
      //sendTokenToServer(value);
      Pref.setFcmToken(token: '$value');
    });
    FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
      //print(event.notification!.body);
      RemoteNotification? notification = message.notification;
      if (notification != null) {
        print("Notification received when app in foreground");
      }
    });
    FirebaseMessaging.onMessageOpenedApp.listen((message) {
      print('Message clicked!');
    });
   await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );
  }

  @override
  Widget build(BuildContext context) {
    return _materialApp();
  }

  Widget _materialApp() {
    return FutureBuilder(
        future: _loginState(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              key: materialAppKey,
              darkTheme: AppTheme.lightTheme,
              theme: AppTheme.lightTheme,
              home: isUserLoggedIn == true ? 
              BottomNavigationContainer() : LoginOptions(),
            );
          } else {
            return Container(color: Colors.white);
          }
        });
  }

  Future<void> _loginState() async {
    final token = await Pref.getToken();
    isUserLoggedIn = token.length > 0 ? true : false;
  }
}

Suggest me what I am missing or doing wrong.

15
  • Add main.dart file code.
    – Yashraj
    Commented Jan 18, 2022 at 13:15
  • main.dart file code update @Yashraj Commented Jan 20, 2022 at 5:09
  • Add this line in main() : FirebaseMessaging.onBackgroundMessage(_messageHandler);
    – Yashraj
    Commented Jan 20, 2022 at 5:14
  • Added but still not working when i remove the app from recent app. @Yashraj Commented Jan 20, 2022 at 6:17
  • At least on Android this requires an implementation of MessagingService ...which is white-listed, in order to be able to run in the background (even when Activity is not running). While I'd assume this to be a likely duplicate Q, without having searched ...the assumption, that an app which is not running, could handle a background message, makes no sense at all. Commented Jan 20, 2022 at 6:39

2 Answers 2

19
+50

Thank to all for your response.

I Found the solution that why my background handler not working because I am running my app in Debugging mode. As per the FlutterFire Cloud messaging Doc background method not work in Debugging mode if you kill your app.

You can test your background handler method by run your application in debug and then background it by switching apps so it's no longer in the foreground.

If You want to check After app terminate/kill from recent task then Run app in Release Mode. It Works fine

Again thanks to All.

2
  • 1
    another way is open app again and close it, hence it will work as terminated app.
    – A.K.J.94
    Commented Mar 13, 2022 at 17:54
  • The actual question is,, Not getting notification when app in background, What is the correct solution?...we did all area,,, we need to know if anyone missing,, Its causing not only in debug mode also in release mode Commented Feb 29, 2024 at 10:40
0

I needed to add under given line in the server-side body of the notification. "click_action": "FLUTTER_NOTIFICATION_CLICK", and the postman json is: { "to": "foP947GMRmuin1N********************", "priority": "high", "notification": { "title": "Sakib sent a offer", "body": "An electric bike used 2 years", "android_channel_id": "Messages", "count": 10, "notification_count": 12, "badge": 12, "color": "#eeeeee" }, "data": { "click_action": "FLUTTER_NOTIFICATION_CLICK", "type": "msj", "id": "1" } }

And in your manifest just add following code: <intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>

Not the answer you're looking for? Browse other questions tagged or ask your own question.