【问题标题】:Widget onUpdate called when Configuration Activity is launched启动配置活动时调用的小部件 onUpdate
【发布时间】:2012-07-29 03:50:08
【问题描述】:

我正在实现一个小部件,但遇到以下问题:

1) onUpdate 在我将小部件添加到主屏幕时被调用,即使我指定了配置活动。我将它添加到主屏幕后,立即发送APPWIDGET_ENABLED 广播,然后发送APPWIDGET_UPDATE,然后启动配置活动.. 这是一个错误吗?我应该如何理解在配置活动返回之前调用的 onUpdate 方法?我可以通过共享首选项值来做到这一点,但我希望它的行为与开发人员指南中所写的一样,即不应调用 onUpdate 方法。

2) onUpdate 不是每隔updatePeriodMillis 秒调用一次,它已设置为10000,即10 秒用于测试目的.. 我错过了@清单文件中的 987654331@ 声明?我不断收到 Lint 警告导出的接收器不需要许可,但我认为这是 Lint 问题,而不是我的错。 编辑:我刚刚在参考文档中找到了这一点:注意:使用 updatePeriodMillis 请求的更新不会每 30 分钟发送一次以上。 所以正确的是小部件未更新我指定的频率,我已将时间更改为 1800000 毫秒。

3) 我想将自己的广播操作传递给小部件提供程序,在 Manifest 中添加另一个针对同一提供程序类的 receiver 块是否正确,或者我应该只添加另一个意图包含APPWIDGET_UPDATE 操作的intent-filter 中的操作?顺便说一句,我已经评论了我的第二个 receiver 块,这不是上述问题的原因。我创建了另一个 receiver 块,因为我想将其声明为未导出,以便让 intent-filter 操作仅由我的应用代码触发,而不是由其他任何人触发。

AndroidManifest.xml

    <receiver android:name="MyWidgetProvider" 
        android:exported="true">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/my_widget_info" />
    </receiver>
    <receiver android:name="MyWidgetProvider" 
        android:exported="false">
        <intent-filter>
            <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
        </intent-filter>
    </receiver>

my_widget_info.xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="110dp"
    android:updatePeriodMillis="1800000"
    android:initialLayout="@layout/my_widget_layout"
    android:configure="org.test.mywidget.MyWidgetConfiguration" 
    android:resizeMode="none">
</appwidget-provider>

【问题讨论】:

  • 对于 1) 在此处查看我的答案:stackoverflow.com/a/12236443/380151
  • @Spiff 这也是我解决问题的方法,方法是使用每个小部件实例的 isInitialized_ID 布尔共享首选项。谢谢。
  • 您能否提供有关您的解决方案的更多描述?也许一些代码示例?

标签: android android-widget broadcastreceiver android-manifest android-appwidget


【解决方案1】:

深挖源码后给出答案:

1) 这是预期行为,请参阅here

用户添加 App Widget 时也会调用该方法

2) 看来您已经找到了自己的答案。对于其他寻找文档的人,请转到 here

注意:使用 updatePeriodMillis 请求的更新不会每 30 分钟发送一次以上

3) 由于 AppWidgetProvider 扩展了 BroadcastReceiver 但未声明为 final,您可以从第二个接收器添加操作

<receiver android:name="MyWidgetProvider" 
        android:exported="true">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/my_widget_info" />
    </receiver>

然后您可以在 MyWidgetProvider 类中覆盖 onReceive ,如果该操作是您的自定义操作,请处理它,否则像这样调用 super.onRecieve(Context context, Intent intent):

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction()
         .equals("org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE")){
        // handle your action
    } else {
        super.onRecieve(context, intent);
    }
}

根据指南:

AppWidgetProvider 只是一个便利类。如果你想 直接接收 App Widget 广播,可以自己实现 BroadcastReceiver 或覆盖 onReceive(Context, Intent) 回调。

需要注意的一点是,远程视图的更新只会在 updatePeriodMillis 被调用,无论您是否将自己的操作添加到 Intent 以供提供者处理。

祝你好运,编码愉快!

【讨论】:

  • 1) 是的,但是下一句告诉我们However, if you have declared a configuration Activity, 这个方法没有被调用 when the user adds the App Widget, but is called for the subsequent updates
猜你喜欢
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多