如何在后台使用 Flutter Method Channel(应用最小化/关闭)
Posted
技术标签:
【中文标题】如何在后台使用 Flutter Method Channel(应用最小化/关闭)【英文标题】:How to use Flutter Method Channel in background (app minimised/closed) 【发布时间】:2020-11-23 10:27:54 【问题描述】:我正在开发 Flutter 应用程序中的原生 android 小部件。其中有刷新按钮,单击该按钮我必须调用 Flutter 代码中的方法。我正在使用 Flutter Method Channel 进行通信,当应用程序处于前台时它工作正常。但是当应用程序最小化或关闭时它不起作用。我收到错误 PlatformException(NO_ACTIVITY, null, null)。下面是我的代码。
Android (AppWidgetProvider)
if (methodChannel == null && context != null)
FlutterMain.startInitialization(context)
FlutterMain.ensureInitializationComplete(context, arrayOf())
// Instantiate a FlutterEngine.
val engine = FlutterEngine(context.applicationContext)
// Define a DartEntrypoint
val entrypoint: DartEntrypoint = DartEntrypoint.createDefault()
// Execute the DartEntrypoint within the FlutterEngine.
engine.dartExecutor.executeDartEntrypoint(entrypoint)
// Register Plugins when in background. When there
// is already an engine running, this will be ignored (although there will be some
// warnings in the log).
//GeneratedPluginRegistrant.registerWith(engine)
methodChannel = MethodChannel(engine.dartExecutor.binaryMessenger, MainActivity.CHANNEL)
methodChannel!!.invokeMethod("fetchNewData", "", object : MethodChannel.Result
override fun notImplemented()
Toast.makeText(context, "method not implemented", Toast.LENGTH_SHORT).show()
override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?)
Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show()
override fun success(result: Any?)
Toast.makeText(context, "success", Toast.LENGTH_SHORT).show()
)
颤动
/// calling in main
static Future<void> attachListeners() async
WidgetsFlutterBinding.ensureInitialized();
var bloc = new AqiCnDashboardBloc();
_channel.setMethodCallHandler((call)
switch (call.method)
case 'fetchNewData':
bloc.getAqiCn(false);
return null;
default:
throw MissingPluginException('notImplemented');
);
【问题讨论】:
您可以使用Work Manager Api 的帮助,即使应用程序关闭也可以处理后台事件 @KrishBhanushali 它不仅仅与背景事件有关。问题是如何在后台使用方法通道(期望前台活动)。 @KrishBhanushali 尝试了 WorkManager 插件。同样的错误正在发生。 【参考方案1】:我正在收集信息/讨论,将我们重定向到在后台运行颤振引擎。
void callbackDispatcher()
WidgetsFlutterBinding.ensureInitialized();
print("Our background job ran!");
void main()
static const MethodChannel _channel = const MethodChannel("channel-name");
Future<void> initialize(final Function callbackDispatcher) async
final callback = PluginUtilities.getCallbackHandle(callbackDispatcher);
await _channel.invokeMethod('initialize', callback.toRawHandle());
如此处所述How to run Flutter in the background?
当原生启动后台作业时,Flutter 引擎处于不活动状态。所以我们无法运行 Dart。 Android/ios可以在后台启动Flutter引擎吗? 是的!我们首先需要注册一个 Dart 回调函数,该回调函数只会在本机代码启动后台作业时调用。 此回调函数称为 callbackDispatcher。
还请查看这些 *** 讨论。
Flutter : Run an app as a background service
How to create a service in Flutter to make an app to run always in background?
How to create a Flutter background service that works also when app closed
Executing Dart in the Background with Flutter Plugins and Geofencing
【讨论】:
我已经浏览过这些文章。可以发一下代码吗?【参考方案2】:您可以通过注册一个 Dart 回调函数在后台启动 Flutter 引擎,该回调函数只会在 Flutter 中启动后台作业时调用。
试试这个。 https://medium.com/vrt-digital-studio/flutter-workmanager-81e0cfbd6f6e
【讨论】:
以上是关于如何在后台使用 Flutter Method Channel(应用最小化/关闭)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中使用 Agora 实现 Callkeep?