如何从 Flutter 发送 ACTION_APPWIDGET_UPDATE 广播

如何解决如何从 Flutter 发送 ACTION_APPWIDGET_UPDATE 广播

在我的“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

在原生部分 https://github.com/ABausG/home_widget/blob/3de5ff703e9f8f7700036a23e609e0627976f904/android/src/main/kotlin/es/antonborri/home_widget/HomeWidgetPlugin.kt#L61

"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 插件来实现这一点

https://github.com/ABausG/home_widget/blob/3de5ff703e9f8f7700036a23e609e0627976f904/example/lib/main.dart#L10

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());
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?