Launch screen from native background service

前端 未结 1 688
醉话见心
醉话见心 2020-12-17 03:20

I have a simple Flutter app that start a native background service using MethodChannel. This native background service notify my Flutter app using BasicMe

相关标签:
1条回答
  • 2020-12-17 03:50

    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 notification
    Intent 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.

    0 讨论(0)
提交回复
热议问题