Мы хотели бы включить или отключить виджеты с помощью кода. Когда мы говорим
«отключить» мы подразумеваем, что виджет, который зарегистрирован в приложении
не должен отображаться в списке доступных пользователю виджетов при
они пытаются добавить виджет на главный экран.
Этот вопрос задавался, к сожалению, много раз без
ответ.
Был один ответ Дайан Хэкборн на отдельный
вопрос виджета, который предполагает, что можно было использовать
Диспетчер пакетов для отключения виджетов:
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 (расположен
в Base.git источника Android на \ src \ base \ services \ java \ com \ android
\ server), который загружает список доступных виджетов, кэширует этот список
из доступных виджетов. Если бы это было так, то выше
код, который включает или отключает компонент виджета, будет работать после
сброс устройства, потому что не было бы кеша; Это не.
Я также попытался изучить некоторые методы
AppWidgetProvider, например, отфильтровывая любые события. Я не думаю
это пойдет куда угодно, потому что AppWidgetService, который заполняет
список, использует диспетчер пакетов, чтобы найти все компоненты, которые ловят
действие ACTION_APPWIDGET_UPDATE при запуске и когда пакет
добавлено (т.е. установлено новое приложение). Единственный раз, когда провайдер
удалено из этого списка в трансляции ACTION_PACKAGE_REMOVED.
Таким образом, учитывая, что поставщики всегда будут там, независимо от
включено / отключено состояние компонента, я посмотрел на фактическое
список действий, который отображается из приложения Launcher, когда пользователь долго
щелкает рабочий стол и добавляет виджет: AppWidgetPickActivity в
Settings.GIT в
com.android.settings. Это, к сожалению, заполняет список
непосредственно из AppWidgetService, без какой-либо фильтрации
Статус компонента включен:
void putInstalledAppWidgets (элементы списка) {
Список установлен =
mAppWidgetManager.getInstalledProviders ();
putAppWidgetItems (установлено, пусто, элементы);
}
Я бы хотел посмотреть, преодолел ли кто-нибудь это препятствие. Возможно я
идти по этому пути неправильно. Все, что я хочу, это иметь возможность удалить
виджет из списка виджетов, доступных пользователю при попытке
добавить виджет на их домашний экран.