Launch screen from native background service Launch screen from native background service dart dart

Launch screen from native background service


On Android you need to display a high priority notification. This displays the slide-down notification panel which will appear over the lock screen or another app. Since you are using native code already, you can create this notification there, or send a message to the Dart side (as you are doing, using MethodChannel) where it can use the flutter_local_notifications plugin to display it. When the user click the notification, your flutter app is brought to the foreground. In Java you might use code similar to this:

// Create an intent which triggers the fullscreen notificationIntent intent = new Intent(Intent.ACTION_MAIN, null);intent.setAction("SELECT_NOTIFICATION");Class mainActivityClass = getMainActivityClass(context);intent.setClass(context, mainActivityClass);PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);// Build the notification as an ongoing high priority item to ensures it will show as// a heads up notification which slides down over top of the current content.final Notification.Builder builder = new Notification.Builder(context, CHANNEL_ID);builder.setOngoing(true);// Set notification content intent to take user to fullscreen UI if user taps on the// notification body.builder.setContentIntent(pendingIntent);// Set full screen intent to trigger display of the fullscreen UI when the notification// manager deems it appropriate.builder.setFullScreenIntent(pendingIntent, true);// Setup notification content.int resourceId = context.getResources().getIdentifier("app_icon", "drawable", context.getPackageName());builder.setSmallIcon(resourceId);builder.setContentTitle("Your notification title");builder.setContentText("Your notification content.");MyPlugin.notificationManager().notify(someId, builder.build());

Then, for Android 8.1 or higher, add the following to your MainActivity class, found under the android/app/src/main/java/packageName/ folder

GeneratedPluginRegistrant.registerWith(this);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {  setShowWhenLocked(true);  setTurnScreenOn(true);}

(This shows the Flutter app even when the screen is locked.)

Flutter only has one activity, so the above code will bring that Flutter activity to the foreground (note that you don't always see the notification, but sometimes you do - if you set it to autoCancel then touching it clears it). It's up to you to build the correct screen in Flutter, which you can do as you send the notification. Use Navigator.push or equivalent to change the page that Flutter is showing.