我创建了一个小部件,它使用后台服务进行更新通知。
如果最后一个小部件从主屏幕上删除,我想停止后台服务。
如何检测主屏幕中剩余的小部件数量?
好吧,我找到了一种不需要存储任何持久信息的方法。然而,对我来说,这似乎是一个黑客攻击。在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
中执行此操作,因为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
上测试并查看了传递给我的服务的额外信息,如果"lastWidgetDeleted"被定义为true,那么我会停止服务并更新我的偏好。
答案可能太晚了,但只有在实例化第一个小部件和删除特定appwidget提供程序的最后一个小部件时,才会调用onEnabled和onDisabled。因此,不需要上述技巧和其他技术。
如果您仍然有疑问,请查看Android文档