我们想通过代码启用或禁用小部件.当我们说"禁用"时,我们的意思是,当用户尝试将小部件添加到其主屏幕时,应用程序中注册的小部件不应显示在用户可用的小部件列表中.遗憾的是,这个问题多次被问到没有答案.
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);
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.窗口小部件组件仍将显示在窗口小部件列表中.可能是AppWidgetService(位于Android源的Base.git位于\ src\base\_服务\ java\com\android\server中),它加载可用小部件列表,缓存此可用小部件列表.如果是这种情况,那么启用或禁用窗口小部件组件的上述代码将在设备重置后工作,因为没有缓存; 它不是.
我也尝试过调试覆盖AppWidgetProvider的一些方法,例如过滤掉任何事件.我不认为这会在任何地方,因为填充列表的AppWidgetService使用包管理器来查找在启动时和添加包时(即安装了新应用程序)捕获ACTION_APPWIDGET_UPDATE操作的所有组件.从此列表中删除提供程序的唯一时间是在ACTION_PACKAGE_REMOVED广播上.因此,鉴于提供程序将始终存在,无论组件的启用/禁用状态如何,我都会查看当用户长按桌面并添加小部件时从Launcher应用程序显示的实际列表活动:AppWidgetPickActivity在com.android.settings中的Settings.GIT中.遗憾的是,这会直接从AppWidgetService填充列表,而不会对组件的启用状态进行任何过滤:void putInstalledAppWidgets(List items){List installed = mAppWidgetManager.getInstalledProviders(); putAppWidgetItems(安装,null,items); }
我很想知道是否有人克服了这个障碍.也许我会以错误的方式去做.我想要的是能够在用户尝试将小部件添加到其主屏幕时从小部件列表中删除小部件.