Мы хотели бы включить или отключить виджеты с помощью кода. Когда мы говорим "disable" мы имеем в виду, что виджет, который зарегистрирован в приложении не должны отображаться в списке виджетов, доступных пользователю, когда они пытаются добавить виджет на свой домашний экран. Этот вопрос задавался, к сожалению, много раз без ответ.
Был один ответ Дайанн Хакборн на отдельный вопрос о виджетах, в котором было предложено использовать менеджер пакетов для отключения виджетов:
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), который загружает список доступных виджетов, кэширует этот список доступных виджетов. Если бы это было так, то вышеприведенное код, который включает или отключает компонент виджетов, будет работать после device reset, потому что не будет кеша; Это не.
Я также попытался пересмотреть некоторые методы AppWidgetProvider, например, для фильтрации любых событий. Я не думаю это пойдет куда угодно, потому что AppWidgetService, который заполняет список, использует диспетчер пакетов, чтобы найти все компоненты, которые действие ACTION_APPWIDGET_UPDATE при запуске и когда пакет добавлено (т.е. установлено новое приложение). Единственный раз, когда поставщик удаленный из этого списка, включен в эфир ACTION_PACKAGE_REMOVED. Поэтому, учитывая, что поставщики всегда будут там, независимо от того, включено/выключено состояние компонента, я просмотрел фактическое который показан в приложении Launcher, когда пользователь долгое время, нажимает на рабочий стол и добавляет виджет: AppWidgetPickActivity в Настройки .GIT в com.android.settings. Это, к сожалению, заполняет список непосредственно из AppWidgetService, без какой-либо фильтрации для статус компонента включен: void putInstalledAppWidgets (элементы списка) { Список установлен = mAppWidgetManager.getInstalledProviders(); putAppWidgetItems (установлено, null, items); }
Мне бы хотелось увидеть, преодолел ли кто-нибудь это препятствие. Возможно, я это происходит неправильно. Все, что я хочу, - это удалить виджета из списка виджетов, доступных пользователю, когда они пытаются добавьте виджет на главный экран.