Динамично включение или отключение виджета не работают

Мы хотели бы включить или отключить виджеты с помощью кода. Когда, как мы говорим, "отключают", мы подразумеваем, что виджет, который регистрируется в приложении, не должен обнаруживаться в списке виджетов, доступных пользователю, когда они пытаются добавить виджет к своему главному экрану. Этот вопрос задали, к сожалению, много раз без ответа.

Был один ответ 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 (расположился в Base.git источника Android в \src\base\services\java\com\android \server), который загружает список доступных виджетов, кэширует этот список доступных виджетов. Если бы это имело место, тем не менее, затем вышеупомянутый код, который включает или отключает компонент виджета, то работал бы после того, как устройство сбросило, потому что не было бы никакого кэша; это не делает.

Я также попытался изучить переопределение некоторых методов AppWidgetProvider, таких как отфильтровывание любых событий. Я не думаю, что это пойдет куда угодно, потому что AppWidgetService, который заполняет список, использует Диспетчер пакетов для нахождения всех компонентов, которые ловят действие ACTION_APPWIDGET_UPDATE с запуском и когда пакет добавляется (т.е. новое приложение установлено). Единственное время, когда поставщик удален из этого списка, находится на широковещательной передаче ACTION_PACKAGE_REMOVED. Таким образом, учитывая, что поставщики всегда будут там, независимо от включенного/нерабочего состояния из компонента, я изучил фактическое действие списка, которое показывают из приложения для Средства запуска, когда пользователь долго - нажимает рабочий стол и добавляет виджет: AppWidgetPickActivity в Настройках. МЕРЗАВЕЦ в com.android.settings. Это, к сожалению, заполняет список непосредственно от AppWidgetService без любой фильтрации для включенного состояния компонента: освободите putInstalledAppWidgets (элементы списка) {Список, установленный = mAppWidgetManager.getInstalledProviders (); putAppWidgetItems (установленный, пустой указатель, объекты);}

Я хотел бы видеть, преодолел ли кто-либо это препятствие. Возможно, я иду об этом неправильным путем. Все, что я хочу, должно смочь удалить виджет из списка виджетов, доступных пользователю, когда они пытаются добавить виджет к своему главному экрану.

15
задан Matt Clark 11 December 2012 в 23:13
поделиться

1 ответ

Возможно, служба AppWidgetService (находится в Base.git исходного кода Android по адресу \ src \ base \ services \ java \ com \ android {{1} } \ server), который загружает список доступных виджетов , кэширует этот список доступных виджетов .

Так и есть, насколько я могу судить. Список хранится в mInstalledProviders ; этот список добавляется через readStateFromFileLocked () , который, похоже, вызывается из логики запуска системы.

Если бы это было так, то приведенный выше код, который включает или отключает компонент виджета, будет работать после сброса устройства, потому что там не было бы кеша; это не.

Вы предполагаете кэш ОЗУ. Кеш - это файл XML.

Это, к сожалению, заполняет список непосредственно из службы AppWidgetService, без какой-либо фильтрации для статуса компонента.

И это могло бы появиться быть ошибкой в ​​Android. В более общем плане, я считаю, что все кеширование - это ошибка - я не вижу способа восстановить, если этот кеш не синхронизирован.

Я бы порекомендовал вам опубликовать свое сообщение о проблеме в общедоступном трекере проблем Android , если вы еще этого не сделали.

4
ответ дан 1 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: