检测最后删除的小部件

时间:2012-01-05 11:49:29

标签: android android-widget

我创建了一个使用后台服务进行更新通知的小部件。

如果从主屏幕删除最后一个小部件,我想停止后台服务。

如何检测主屏幕中剩余的小部件数量?

4 个答案:

答案 0 :(得分:2)

好的,我想出了一种不需要存储任何持久信息的方法。然而,即使这看起来像是对我的黑客攻击。在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编码实际上都是黑客攻击 - 而完成工作的代码主要使用无证或意外的途径。)

答案 1 :(得分:1)

如果您为AppWidgetProvider创建了Widget,则应该使用onUpdate()方法。 onUpdate()的一个论点是int[] ids。这实际上是接收onUpdate()个请求的所有AppWidget实例的数组。如果ids的大小为1,则下一次删除是您的最后一个小部件。 :)

希望这有帮助, FuzzicalLogic

答案 2 :(得分:0)

我的应用程序遇到了类似的问题,这就是我最终要弄清楚我是否删除了最后一个小部件,这使我能够停止服务并更新已保存的首选项。

@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,那么我会停止服务并更新我的偏好。

答案 3 :(得分:0)

可能是答案太晚但是onEnabled和onDisabled仅在第一个窗口小部件被实例化时以及为特定的appwidget提供者移除最后一个窗口小部件时被调用。因此,不需要上述hacky和其他技术。

如果您仍有疑问,请浏览Android doc