gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:48 35 4
gpt4 key购买 nike

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

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

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

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

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

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

先谢谢你。

最佳答案

恭喜,您遇到了幻影应用程序小部件。它似乎记录在 Android issue tracker 上.它们通常发生在 appwidget 的配置 Activity 被取消时,尽管这似乎是由于配置 Activity 的不当实现;开发人员在将 Activity 结果设置为 RESULT_CANCELED 时忽略了将应用小部件 ID 作为额外内容包含在内。 (即使是 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 值,指示配置 Activity 未被取消,然后在您的其他代码中查询该值。如果遇到幻影小部件,您还可以使用此信息“删除”它。在您的 appwidget 配置 Activity 中:

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
}

关于android - 使用 appWidgetId 检查主屏幕上是否存在小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387191/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com