我们想通过代码启用或禁用小部件.当我们说"禁用"时,我们的意思是,当用户尝试将小部件添加到其主屏幕时,应用程序中注册的小部件不应显示在用户可用的小部件列表中.遗憾的是,这个问题多次被问到没有答案.
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); }
我很想知道是否有人克服了这个障碍.也许我会以错误的方式去做.我想要的是能够在用户尝试将小部件添加到其主屏幕时从小部件列表中删除小部件.
可能是 AppWidgetService(位于 Android 源的 Base.git 中 \src\base\services\java\com\android\server),它加载可用小部件列表,缓存可用小部件列表。
确实如此,据我所知。它将列表存储在mInstalledProviders; 这个列表被添加到 via readStateFromFileLocked(),它似乎是从系统启动逻辑调用的。
但是,如果是这种情况,那么上面启用或禁用小部件组件的代码将在设备重置后工作,因为将没有缓存;它不是。
您假设有一个 RAM 缓存。缓存是一个 XML 文件。
不幸的是,这直接从 AppWidgetService 填充列表,没有对组件的启用状态进行任何过滤
这似乎是 Android 中的一个错误。更一般地说,我认为整个缓存的事情是错误——如果缓存不同步,我认为没有办法恢复。
我建议您将您的文章作为问题发布在公共 Android 问题跟踪器上,如果您还没有这样做的话。
| 归档时间: |
|
| 查看次数: |
4244 次 |
| 最近记录: |