![](/img/trans.png)
[英]AppWidget Update Service does not stop on Widget being Deleted from host
[英]Detect last widget being deleted
我創建了一個使用后台服務進行更新通知的小部件。
如果最后一個窗口小部件已從主屏幕中刪除,我想停止后台服務。
如何檢測主屏幕中剩余的小部件數量?
好的,我想出了一種無需存儲任何持久性信息的方法。 但是,即使對我來說,這似乎也是一個hack。 在onReceive中插入了以下內容-
@Override
public void onReceive(Context context, Intent intent) {
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(sIntentAction)) {
AppWidgetManager amgr = AppWidgetManager.getInstance(context);
int length = amgr.getAppWidgetIds(intent.getComponent()).length;
if (length==0) WidgetService.StopService(context);
}
super.onReceive(context, intent);
}
它有效,並且是我能找到的最佳解決方案,但是我對此並不滿意。
我需要在onReceive
而不是onDeleted
執行此onDeleted
,因為intent
對象需要執行intent.getComponent()
。 我不喜歡這個事實,因為文檔聲稱很少需要接觸onReceive
,而需要計算剩余的小部件似乎是onDeleted
的合理期望。 但是,不幸的是,它提供了要刪除的小部件的數量,而不是剩余的數量。 有什么方法可以代替onDeleted
嗎?
(慢慢地,我似乎感覺到很多Android編碼實際上是在被黑客入侵-而完成工作的代碼大多使用未記錄或意外的途徑。)
如果您為Widget
創建了一個AppWidgetProvider
,則它應具有onUpdate()
方法。 onUpdate()
的參數之一是int[] ids
。 實際上,這是所有接收onUpdate()
請求的AppWidget實例的數組。 如果ids
的大小為1,則下一個刪除是您的最后一個小部件。 :)
希望對您有所幫助,FuzzicalLogic
我的應用程序有一個類似的問題,這就是我最終要弄清楚是否刪除了最后一個小部件,這使我可以停止服務並更新保存的首選項。
@Override
public void onDisabled(Context context)
{
// When this get called I need to figure out how to set the preference
// homeWidgetSetup = false.
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisAppWidget = new ComponentName(context, BasicHomeWidget.class.getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
if(appWidgetIds.length < 1)
{
Log.d(TAG, "Removed the last widget!");
Intent intent = new Intent(context, KMMDService.class);
intent.putExtra("lastWidgetDeleted", true);
context.startService(intent);
}
}
然后,我只是測試了onStartCommand
我的服務的額外onStartCommand
,如果將“ lastWidgetDeleted”定義為true,那么我將停止服務並更新我的首選項。
可能答案太遲了,但是僅當實例化第一個小部件並且為特定的appwidget提供者刪除了最后一個小部件時,才調用onEnabled和onDisabled。 因此,不需要上述技巧和其他技術。
如果您仍然有疑問,請閱讀Android文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.