如何从 Flutter 发送 ACTION_APPWIDGET_UPDATE 广播
How can I send a ACTION_APPWIDGET_UPDATE Broadcast from Flutter
在我的“java”应用程序中,我的 getDataFromServer() 函数中有这段代码(我的 WorkManager 每 2 小时和我的 MainActivity Onrefresh() 调用一次)以更新我的主屏幕小部件有新数据:
AppWidgetManager.getInstance(context).getAppWidgetIds(
new ComponentName(context,MyWidgetProvider.class));
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(MyWidgetProvider.WIDGET_ID_KEY, ids);
context.sendBroadcast(updateIntent);
这将使我的 MyAppWidgetProvider “醒来”,从文件中读取新数据并更新。
现在,我已经把我的逻辑转移到 Flutter 上了,我不知道如何从我的 Dart 代码中调用这段代码。
有什么建议吗?
可以参考包https://pub.dev/packages/home_widget
"updateWidget" -> {
val className = call.argument<String>("android") ?: call.argument<String>("name")
try {
val javaClass = Class.forName("${context.getPackageName()}.${className}")
val intent = Intent(context, javaClass)
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
val ids: IntArray = AppWidgetManager.getInstance(context.applicationContext).getAppWidgetIds(ComponentName(context, javaClass))
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
} catch (classException: ClassNotFoundException) {
result.error("-3", "No Widget found with Name $className. Argument 'name' must be the same as your AppWidgetProvider you wish to update", classException)
}
}
在 Background Update
的 Dart 部分
https://pub.dev/packages/home_widget#background-update
由于 HomeWidget
的方法是静态的,即使应用程序在后台,也可以在后台使用 HomeWidget
来更新 Widget。
示例应用程序使用 flutter_workmanager
插件来实现
void callbackDispatcher() {
Workmanager.executeTask((taskName, inputData) {
debugPrint('Native called background task: $taskName');
final now = DateTime.now();
return Future.wait<bool>([
HomeWidget.saveWidgetData('title', 'Updated from Background'),
HomeWidget.saveWidgetData('message',
'${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')} ${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}:${now.second.toString().padLeft(2, '0')}'),
HomeWidget.updateWidget(
name: 'HomeWidgetExampleProvider', iOSName: 'HomeWidgetExample'),
]).then((value) {
return !value.contains(false);
});
});
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager.initialize(callbackDispatcher, isInDebugMode: kDebugMode);
runApp(MyApp());
}
在我的“java”应用程序中,我的 getDataFromServer() 函数中有这段代码(我的 WorkManager 每 2 小时和我的 MainActivity Onrefresh() 调用一次)以更新我的主屏幕小部件有新数据:
AppWidgetManager.getInstance(context).getAppWidgetIds(
new ComponentName(context,MyWidgetProvider.class));
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(MyWidgetProvider.WIDGET_ID_KEY, ids);
context.sendBroadcast(updateIntent);
这将使我的 MyAppWidgetProvider “醒来”,从文件中读取新数据并更新。
现在,我已经把我的逻辑转移到 Flutter 上了,我不知道如何从我的 Dart 代码中调用这段代码。
有什么建议吗?
可以参考包https://pub.dev/packages/home_widget
"updateWidget" -> {
val className = call.argument<String>("android") ?: call.argument<String>("name")
try {
val javaClass = Class.forName("${context.getPackageName()}.${className}")
val intent = Intent(context, javaClass)
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
val ids: IntArray = AppWidgetManager.getInstance(context.applicationContext).getAppWidgetIds(ComponentName(context, javaClass))
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
} catch (classException: ClassNotFoundException) {
result.error("-3", "No Widget found with Name $className. Argument 'name' must be the same as your AppWidgetProvider you wish to update", classException)
}
}
在 Background Update
的 Dart 部分
https://pub.dev/packages/home_widget#background-update
由于 HomeWidget
的方法是静态的,即使应用程序在后台,也可以在后台使用 HomeWidget
来更新 Widget。
示例应用程序使用 flutter_workmanager
插件来实现
void callbackDispatcher() {
Workmanager.executeTask((taskName, inputData) {
debugPrint('Native called background task: $taskName');
final now = DateTime.now();
return Future.wait<bool>([
HomeWidget.saveWidgetData('title', 'Updated from Background'),
HomeWidget.saveWidgetData('message',
'${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')} ${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}:${now.second.toString().padLeft(2, '0')}'),
HomeWidget.updateWidget(
name: 'HomeWidgetExampleProvider', iOSName: 'HomeWidgetExample'),
]).then((value) {
return !value.contains(false);
});
});
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager.initialize(callbackDispatcher, isInDebugMode: kDebugMode);
runApp(MyApp());
}