[英]Check if a widget is exists on homescreen using appWidgetId
我正在使用AlarmManager
來更新我的小部件。 如果主屏幕上沒有小部件,我想停止它。 但是我在檢測主屏幕上是否沒有小部件時遇到問題。
每當我嘗試使用這種方式獲取AppWidgetIds時:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIDs = appWidgetManager
.getAppWidgetIds(new ComponentName(context, Widget.class));
我得到了一段appWidgetIDs
而實際上主屏幕上沒有小部件。 為什么?
因此,我想知道是否有辦法檢測主屏幕上是否存在小部件ID。
先謝謝你。
恭喜你,你遇到了幻影appwidgets。 它似乎記錄在Android問題跟蹤器上 。 它們通常在取消appwidget的配置活動時發生,盡管它似乎是通過不正確的配置活動實現; 在將活動結果設置為RESULT_CANCELED
時,開發人員忽略將appwidget ID作為額外ID包含。 (即使Google的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);
}
}
到目前為止,我知道沒有辦法在沒有自己的簿記的情況下檢測幻影appwidget的存在。 我建議存儲一個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;
}
然后你可以檢查你至少有一個非幻像appwidget,如下所示:
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.