如何将应用程序从后台带到前台

How to bring an app from background to foreground

我想把一个在后台的应用调到前台。 This link 使用了一个不起作用的包,尽管作者做了很多工作,但已经 11 个月没有更新了。

所以我正在寻找一种解决方案,将后台应用程序带到前台,甚至(重新)启动应用程序。我花了无数个小时尝试不同的软件包,其中 none 个有效,列表如下:

import 'package:bringtoforeground/bringtoforeground.dart';
import 'package:android_intent/android_intent.dart';
import 'package:flutter_appavailability/flutter_appavailability.dart';
import 'flutterIntent.dart';

flutterIntent.dart 感谢这个存储库:https://github.com/sunsetjesus/flutter_intent

import 'dart:async';

import 'package:flutter/services.dart';

class FlutterIntent {
  static const MethodChannel _channel = const MethodChannel('flutter_intent');

  static Future<String> get platformVersion async {
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }

  static Future<void> openApp(String appId, String targetActivity) async {
    await _channel.invokeMapMethod('openApp', {"appId": appId,"targetActivity": targetActivity});
  }
}

更不用说 IOS 的最后一个解决方案了。

我很惊讶有这么多好的软件包,但似乎没有打开应用程序的默认解决方案(我们可以通过点击图标两次来打开...)。在为 Windows 或 Linux 平台编码时启动另一个应用程序非常简单,所以我真的很惊讶它在移动端需要如此多的努力。

非常感谢您的帮助,

PS:实际上我什至不需要将应用程序带回前台,最初我试图让 await launch(url); 收到通知,所以启动 chrome/firefox/safari url(我没问题)在我的用例中就足够了。

感谢flutter local notification package,我自己解决了这个问题,下面的例子:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

Future _showNotification(FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async {
  var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
      'your channel id', 'your channel name', 'your channel description',
      importance: Importance.max, priority: Priority.high);
  var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
  var platformChannelSpecifics = new NotificationDetails(
      android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics);
  await flutterLocalNotificationsPlugin.show(
    0,
    'New Notification',
    'Flutter is awesome',
    platformChannelSpecifics,
    payload: 'This is notification detail Text...',
  );
}

 static FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
  static onBackgroundMessage(SmsMessage message) async {
    String encodedUrl = message.body;
    debugPrint("onBackgroundMessage called $encodedUrl");
    print('app available');
    await _showNotification(flutterLocalNotificationsPlugin);

  }



  Future onSelectNotification(String payload) async {
    showDialog(
      context: context,
      builder: (_) {
        return new AlertDialog(
          title: Text("Your Notification Detail"),
          content: Text("Payload : $payload"),
        );
      },
    );
  }

void localNotification() {
    var initializationSettingsAndroid =
    new AndroidInitializationSettings('app_icon');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);

}

在 StatefulWidget 中:

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