【问题标题】:Widgets configured with android:configure will receive onUpdate even if configuration is unfinished即使配置未完成,使用 android:configure 配置的小部件也会收到 onUpdate
【发布时间】:2010-12-30 10:06:48
【问题描述】:

这是我如何配置我的 APP 的小部件:

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="240dp"
    android:minHeight="193dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/xyz_appwidget"
    android:configure="com.xyz.activity.Configuration"
    />

因此,一旦用户将小部件放在主屏幕上,系统就会启动Configuration 活动。不幸的是,如果没有应用配置,则不应将此小部件放在屏幕上。

我添加了一些调试输出。当用户为其主屏幕选择小部件时会发生这种情况。 注意:这是配置活动在前面时,而不是小部件。

I/ActivityManager(  101): Start proc com.xyz for broadcast com.xyz/.widget.xyz.XyzWidgetProvider: pid=14371 uid=10050 gids={3003, 1015}
D/XyzWidgetProvider(14371): onReceive: android.appwidget.action.APPWIDGET_ENABLED
D/XyzWidgetProvider(14371): onEnabled
D/XyzWidgetProvider(14371): onReceive: android.appwidget.action.APPWIDGET_UPDATE

这意味着即使小部件未配置,两个事件(启用、更新)也会被触发。 Enabled 对我来说很有意义,但 UPDATE 显然不是。尤其是当 Configuration 活动成功完成时,不会发送额外的 UPDATE 事件。

我还了解到,通过将Configuration 活动的结果设置为Activity.RESULT_CANCELED,可以取消配置过程。但是由于这显然是异步运行的,我不知道如何使配置过程阻塞?有人遇到过这种情况吗?

我的最后一点:我查看了 Android Gallery 小部件,以某种方式正确地管理了这一点,因此不会添加未配置的图库小部件。但我怀疑那里有一些 HTC magic,因为日志不是很有帮助。

【问题讨论】:

标签: android android-widget


【解决方案1】:

您的处理方法如下: 在您的配置活动中,在您的 onCreate() 中执行此操作: setResult(Activity.RESULT_CANCELED);

一旦配置活动完成,例如所有参数均已设置,应显示小部件,执行 setResult(Activity.RESULT_OK);

因此,如果用户没有完成配置活动,您的小部件将被移除。

但是,在小部件代码本身(onUpdate)中,您仍然需要检查配置是否完成,因为APPWIDGET_UPDATE肯定会在配置完成之前被调用。如果配置不存在,您可以完全跳过所有更新,此时您的小部件将不可见,并且一旦配置完成,您的小部件要么被系统删除,要么其配置存在。

还有一件事。成功完成后,您需要从配置活动中启动小部件更新,因为系统不会自行完成。

【讨论】:

  • 如何在onUpdate里面查看配置是否完整?
  • @Giorgi:您在配置中设置了一些首选项。您在 unUpdate 中加载该首选项。如果无法加载 pref = 配置尚未完成。
【解决方案2】:

看来 developer.android.com 上的 Widget api 文档已经过时...

https://groups.google.com/d/topic/android-developers/HfD-ojjsuso/discussion

【讨论】:

    【解决方案3】:

    “但是,在widget代码本身(onUpdate)中,你仍然需要检查配置是否完成,因为APPWIDGET_UPDATE肯定会在配置完成之前被调用。”

    这不是应该的方式。 在 android 开发者网站上,您可以阅读以下内容...

    "在创建App Widget时不会调用onUpdate()方法(系统不会在配置Activity启动时发送ACTION_APPWIDGET_UPDATE广播)。配置Activity负责请求更新首次创建 App Widget 时的 AppWidgetManager。但是,onUpdate() 将被调用以进行后续更新——它只是第一次被跳过。”

    【讨论】:

    • 所以我猜这是一个错误。我有点看到日志中发生了什么。需要多花点时间去测试,还有haimg的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多