19

我采取一个小窗口,我面临着以下问题:窗口小部件的onUpdate调用时配置活动推出

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

2)onUpdate不叫每updatePeriodMillis秒,已被设置为10000,即10秒用于测试目的..我错过清单文件内的receiver申报的东西吗?我一直收到林特警告导出的接收器不需要许可但我认为这是一个Lint问题,不是我的错。 编辑:我刚刚在参考文档中发现了这个:注意:使用updatePeriodMillis请求的更新不会每30分钟发送一次。因此,小部件未更新的频率是正确的,我已将时间更改为1800000毫秒。

3)我想送我自己的广播动作控件提供者,是正确的在清单中添加另一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> 
+3

对于** 1)**请参阅我的答案在这里:http://stackoverflow.com/a/12236443/380151 – Spiff 2012-09-03 14:12:47

+0

@Spiff这是我如何解决这个问题,通过使用* isInitialized_ID *布尔共享首选项-widget实例。谢谢。 – 2012-09-04 14:10:36

+2

您能否提供关于您的解决方案的更多描述?也许一些代码示例? – DrHolera 2016-03-18 10:39:55

回答

0

挖掘到的源代码之后提供一个答案:

1)这是预期行为见here

这种方法,当用户添加该应用的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> 

然后你可以覆盖onReceive在你的MyWidgetProvider类,如果行动是你的自定义操作手柄,否则打电话到super.onRecieve(上下文的背景下,意图意图),像这样:

@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中。

好运和快乐编码!

相关问题