android – 防止触发WidgetProvider的onUpdate

前端之家收集整理的这篇文章主要介绍了android – 防止触发WidgetProvider的onUpdate前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在实现一个具有ConfigurationActivity的Widget,并且必须与Eclair(2.1)保持兼容.

关于AppWidgetProviders onUpdate方法documentation明确指出:

… .However,if you have declared a configuration Activity,this method is not called when the user adds the App Widget,but is called for the subsequent updates. It is the responsibility of the configuration Activity to perform the first update when configuration is done. (See Creating an App Widget Configuration Activity below.)

不幸的是,这不是真的(至少对于带有JellyBean的Nexus S).事实上onUpdate在我的ConfigurationActivity触发器的onCreate之前被调用.我想知道,如果在其他手机上有类似的行为,并且是否可以阻止我的提供商内的onUpdate通话?

我的解决方法是使用特定的AppWidgetId在我的WidgetConfigurationActivity中的SharedPreferences中存储一个标志.如果它不存在,我可以假设没有首先调用ConfigurationActivity.这有效,但在我的观点中真的很难看.如果我无法阻止onUpdate触发,是否有更好的解决方案?

最佳答案
是的,在主屏幕上添加小部件时会调用onUpdate().
看这里:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#ACTION_APPWIDGET_UPDATE

我不确定在创建窗口小部件时是否有办法不触发它.但是,您可以通过将Widget Info XML文件中的“updatePeriodMillis”字段设置为0或将其留空来阻止它再次触发.

另一种方法是将窗口小部件ID存储在某处.现在,无论何时添加新窗口小部件,都要在Receiver类中检查ID是否已存在.如果它不存在(意味着一个新的小部件),那么不要执行任何代码.此外,每当删除窗口小部件时,都会从记录中删除窗口小部件ID由于您可能删除了窗口小部件,因此稍后添加了一个与旧窗口小部件具有相同ID的新窗口小部件.

希望有所帮助!

编辑:
在Receiver类的onReceive()方法中,执行以下操作:

public void onReceive(Context context,Intent intent) {
    // TODO Auto-generated method stub

    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
    if( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID )
    {
        super.onReceive(context,intent);
    }

}

首次从“窗口小部件”列表中选择窗口小部件时,其appWidgetId将等于INVALID_APPWIDGET_ID,直到将其添加到主屏幕上.由于“super.onReceive()”在选择窗口小部件时调用onUpdate()方法,因此第一次不会调用onUpdate().

原文链接:https://www.f2er.com/android/430657.html

猜你在找的Android相关文章