【发布时间】: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