我正在实现一个具有ConfigurationActivity的小部件,并且必须与Eclair(2.1)保持兼容。
关于AppWidgetProviders的documentation的onUpdate
方法明确指出:
不幸的是,事实并非如此(至少对于带有JellyBean的Nexus S)。实际上,在我的ConfigurationActivity触发器的 onUpdate
之前,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,该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()。
关于android - 防止触发WidgetProvider的onUpdate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11781415/