我正在使用AlarmManager
来更新我的小部件。如果主屏幕上没有小工具,我想停止它。但我面临着一个问题,检测主屏幕上是否没有小工具。
每当我尝试使用这种方式获取AppWidgetId时:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIDs = appWidgetManager
.getAppWidgetIds(new ComponentName(context, Widget.class));
我得到了appWidgetIDs
的长度,而实际上主屏幕上没有小部件为什么
因此,我想知道是否有一种方法可以检测主屏幕上是否存在小部件id。
谢谢你。
祝贺您,您遇到了虚幻的应用程序小部件。它似乎记录在Android问题跟踪器上。它们通常发生在appwidget的配置活动被取消时,尽管这似乎是由于配置活动的不正确实现;当将活动结果设置为RESULT_CANCELED
时,开发人员忽略了将appwidget ID作为额外项包括在内。(甚至谷歌的ApiDemos示例应用程序也忽略了这一点!)
正确的实现是这样的:
public class AppWidgetConfigActivity extends Activity {
private int appWidgetId;
private Intent resultValue;
protected void onCreate(bundle saved) {
super.onCreate(saved);
// get the appwidget id from the intent
Intent intent = getIntent();
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
// make the result intent and set the result to canceled
resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_CANCELED, resultValue);
// if we weren't started properly, finish here
if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
/* ... */
}
/* ... */
private void finishConfigure() {
/* finish configuring appwidget ... */
setResult(RESULT_OK, resultValue);
}
}
到目前为止,我不知道如果不自己记账,就无法检测到幻影应用程序的存在。我建议存储一个SharedPreferences值,指示配置活动没有被取消,然后在其他代码中查询该值。如果你遇到幻影小部件,你也可以使用这些信息来"删除"它。在您的appwidget配置活动中:
private void finishConfigure() {
/* finish configuring appwidget ... */
setResult(RESULT_OK, resultValue);
String key = String.format("appwidget%d_configured", appwidgetId);
SharedPreferences prefs = getSharedPreferences("widget_prefs", 0);
prefs.edit().putBoolean(key, true).commit;
}
然后你可以检查你是否至少有一个像这样的非幻影应用程序:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
AppWidgetHost appWidgetHost = new AppWidgetHost(context, 1); // for removing phantoms
SharedPreferences prefs = getSharedPreferences("widget_prefs", 0);
boolean hasWidget = false;
int[] appWidgetIDs = appWidgetManager.getAppWidgetIds(new ComponentName(context, Widget.class));
for (int i = 0; i < appWidgetIDs.length; i++) {
int id = appWidgetIDs[i];
String key = String.format("appwidget%d_configured", id);
if (prefs.getBoolean(key, false)) {
hasWidget = true;
} else {
// delete the phantom appwidget
appWidgetHost.deleteAppWidgetId(id);
}
}
if (hasWidget) {
// proceed
} else {
// turn off alarms
}