【发布时间】:2010-02-06 13:13:17
【问题描述】:
我们希望通过代码启用或禁用小部件。当我们说 “禁用”是指在应用程序中注册的小部件 不应该出现在用户可用的小部件列表中 他们尝试将小部件添加到他们的主屏幕。 不幸的是,这个问题已经被问过很多次了 回答。
黛安·哈克伯恩(Dianne Hackborn)对另一份单独的 小部件问题表明可以使用 包管理器禁用小部件:
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.example.android.apis", ".appwidget.ExampleBroadcastReceiver"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, // or DISABLED
PackageManager.DONT_KILL_APP);
但是,这不起作用。小部件组件仍会出现 在小部件列表中。可能是 AppWidgetService(位于 在 Android 源代码的 Base.git 中的 \src\base\services\java\com\android \server),它加载可用小部件的列表,缓存这个列表 可用的小部件。但是,如果是这样的话,那么上面 启用或禁用小部件组件的代码将在 设备重置,因为没有缓存;它不是。
我也尝试过覆盖一些方法 AppWidgetProvider,例如过滤掉任何事件。我不认为 这将去任何地方,因为填充了 AppWidgetService 列表,使用包管理器查找所有捕获的组件 启动时的 ACTION_APPWIDGET_UPDATE 动作和一个包是 添加(即安装了新应用程序)。提供者的唯一时间是 从此列表中删除是在 ACTION_PACKAGE_REMOVED 广播中。 因此,鉴于提供者将始终存在,无论 组件的启用/禁用状态,我已经查看了实际 列出当用户长时从 Launcher 应用程序显示的活动 点击桌面并添加一个小部件:AppWidgetPickActivity in 设置.GIT 中 com.android.settings。不幸的是,这填充了列表 直接来自 AppWidgetService,没有任何过滤 组件的启用状态: 无效 putInstalledAppWidgets(列表项){ 已安装列表 = mAppWidgetManager.getInstalledProviders(); putAppWidgetItems(已安装,空,项目); }
我很想看看是否有人克服了这个障碍。也许我是 以错误的方式去做。我想要的只是能够删除一个 用户尝试使用时可用的小部件列表中的小部件 将小部件添加到他们的主屏幕。
【问题讨论】:
-
3年后有这个问题的更新吗?