1

從主屏幕刪除我最後一個appWidget實例後,onDisabled,onEnabled無法正常工作。爲什麼在主屏幕上有一個隱藏的appWidget?

我註冊我的小部件作爲廣播接收器,沒有主屏幕上的實例,但廣播收到,我也看到我的日誌寫在我的appWidget核心類!

卸載我的應用程序並重新安裝後,問題解決了,並且onDisabled,onEnabled在添加(移除)第一個(最後一個)實例後正常工作。

我手動收集了appWidgetIds並將其保存在一個文件中,以提供一些更好的方式來訪問我所有的小部件ID,但隱藏的appWidget沒有從我收集的小部件ID中移除,並且還存在於主屏幕中!

問題:

該問題是在Android 2.3.4版(測試設備)的錯誤嗎?在這種情況下,解決方案是什麼?代碼

重要組成部分:

@Override 
public void onEnabled(Context context) { 
    G.logger.out("Enabled"); 
    super.onEnabled(context); 
} 


@Override 
public void onDisabled(Context context) { 
    super.onDisabled(context); 
    G.logger.out("Disabled"); 
    File file = new File(G.infoDir + "/" + getClass().getSimpleName() + ".dat"); 
    if (file.exists()) { 
     file.delete(); 
    } 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    WidgetProperty property = G.widgetPropertyMap.get(getClass().getSimpleName()); 
    property.appWidgetIds = appWidgetIds; 

    addWidgetIds(appWidgetIds, getClass().getSimpleName()); // add widget ids to a file (duplicates will skip) 
    updateAll(getClass(), context); 
} 

@Override 
public void onDeleted(Context context, int[] appWidgetIds) { 
    G.logger.out("Deleted"); 
    removeWidgetIds(appWidgetIds, getClass().getSimpleName()); // remove widget ids from file 
} 
+0

不錯!沒有答案! – Behnam

回答

3

在安卓AppWidgets非常糟糕的設計。

重現bug:

  • 選擇的Widget(到主屏幕上拖放)
  • 選擇返回(硬件密鑰)取消降小部件
  • 現在你已經隱藏控件。

我被包括在setResult(RESULT_CANCELED);爲了防止這個問題,但不會通過android框架處理!

所以我用這個代碼作爲一個愚蠢的方案:

@Override 
protected void onDestroy() { 
    if (!submitted) { 
     AppWidgetHost host = new AppWidgetHost(this, 1); 
     host.deleteAppWidgetId(mAppWidgetId); 
    } 
}