启动配置活动时调用Widget onUpdate

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动配置活动时调用Widget onUpdate相关的知识,希望对你有一定的参考价值。

我正在实现一个小部件,我面临以下问题:

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>
答案

在深入研究源代码后提供答案:

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以供提供程序处理。

祝你好运,快乐的编码!

以上是关于启动配置活动时调用Widget onUpdate的主要内容,如果未能解决你的问题,请参考以下文章

OnUpdate 在 Android Widget 中的 onReceive 之前调用

在通知点击事件时调用活动

如何避免在启动 Activity 时调用 onCreate()?

用于绑定集合的 Android Widget 服务类未被提供者调用

视频结束时调用下一个活动

调试停止时调用函数