我正在实施一个小部件,我面临以下问题:
当我将小部件添加到主屏幕时,即使我指定了配置活动,也会调用 1) onUpdate
。一旦我将其添加到主屏幕,就会发送APPWIDGET_ENABLED
广播,然后发送APPWIDGET_UPDATE
,然后启动配置活动。这是一个错误吗?我应该如何理解在配置活动返回之前调用的onUpdate
方法?我可以通过共享首选项值来实现,但我希望它的行为与开发人员指南中的内容相同,即不应调用onUpdate
方法。
2) onUpdate
不会每隔updatePeriodMillis
秒调用一次,已设置为10000
,即10
秒,以便进行测试。我是否遗漏了清单文件中receiver
声明中的内容?我一直收到Lint警告导出的接收器不需要许可但我认为这是一个Lint问题而不是我的错。
编辑:我刚刚在参考文档中找到了这个:注意:使用updatePeriodMillis请求的更新不会每30分钟发送一次。所以这是正确的小部件未更新我指定的频率,我已将时间更改为1800000
毫秒。
3)我想将自己的广播操作传递给窗口小部件提供程序,在针对同一提供程序类的Manifest中添加另一个receiver
块是否正确,或者我应该仅添加intent-filter
中包含APPWIDGET_UPDATE
操作的另一个意图操作?顺便说一句,我已经评论了我的第二个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>
答案 0 :(得分:0)
在深入研究源代码后提供答案:
1)这是预期的行为,请参阅here
当用户添加App Widget
时,也会调用此方法
2)好像你找到了自己的答案。对于寻找文档的其他人,请转到here
注意:使用updatePeriodMillis请求的更新不会每30分钟发送一次以上
3)由于AppWidgetProvider
扩展BroadcastReceiver
但未宣布为最终版,您可以添加第二个接收器中的操作
<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以供提供程序处理。
祝你好运,快乐的编码!