使用 appWidgetId 检查主屏幕上是否存在小部件

2024-04-28

我在用AlarmManager更新我的小部件。如果主屏幕上没有小部件,我想停止它。但我在检测主屏幕上是否没有小部件时遇到问题。

每当我尝试使用这种方式获取 AppWidgetIds 时:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

int[] appWidgetIDs = appWidgetManager
    .getAppWidgetIds(new ComponentName(context, Widget.class));

我得到的长度为appWidgetIDs而实际上主屏幕上没有小部件。Why?

因此,我想知道是否有一种方法可以检测主屏幕上是否存在小部件 ID。

先谢谢你了。


恭喜,您遇到了幻影应用程序小部件。它似乎记录在Android 问题跟踪器 https://code.google.com/p/android/issues/detail?id=2539。它们通常在应用程序小部件的配置活动被取消时发生,尽管这似乎是由于配置活动的实施不当所致;开发人员在将活动结果设置为时忽略了附加应用程序小部件 IDRESULT_CANCELED。 (甚至 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);
    }
}

到目前为止,我不知道如何在不进行自己记账的情况下检测幻影应用程序小部件的存在。我建议存储一个 SharedPreferences 值,指示配置活动未取消,然后在其他代码中查询该值。如果您遇到幻像小部件,您还可以使用此信息“删除”它。在您的应用程序小部件配置活动中:

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;
}

然后你可以检查你是否至少有一个非幻像应用程序小部件,如下所示:

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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 appWidgetId 检查主屏幕上是否存在小部件 的相关文章

随机推荐