Android: включение / отключение виджетов приложений программно

#android #broadcastreceiver #android-widget #android-appwidget

#Android #broadcastreceiver #android-виджет #android-appwidget

Вопрос:

Вопрос: Есть ли способ включить некоторые виджеты на рабочем столе, которые я предоставляю в своем приложении программно? Например, иметь виджет «премиум» и предоставлять доступ к нему только после оплаты?


Как говорится в документах Android, в манифест следует добавить широковещательный приемник, чтобы сообщить системе, что с приложением поставляется виджет:

 <receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
           android:resource="@xml/example_appwidget_info" />
</receiver>
 

Но теоретически широковещательные приемники также могут быть добавлены программно, поэтому могут ли виджеты быть зарегистрированы позже во время выполнения?

Ответ №1:

Вы можете android:enabled="false" указать <receiver> элемент для виджета приложения в манифесте, затем использовать PackageManager и setComponentEnabledSetting() включать его во время выполнения, когда пользователь что-то делает (например, оплачивает).

Однако, возможно, для этого потребуется перезагрузка, прежде чем на главном экране появится сообщение о появлении нового потенциального поставщика виджетов приложений.

Комментарии:

1. Спасибо! Короткий вопрос к нему: означает ли это, что другие приложения могут вызывать эту функцию, указывая мой компонент приемника, или даже включать ее из командной строки adb?

2. @frangulyan: «означает ли это, что другие приложения могут вызывать эту функцию, указывая мой компонент приемника» — обычные приложения Android SDK не могут. Системные приложения, приложения на корневых устройствах и т. Д. Могут. «даже включить его из командной строки adb?» — я так думаю. ИМХО, это должно быть довольно далеко от вашего списка проблем.

3. Я знаю, что опоздал на вечеринку, но для дальнейшего использования setComponentEnabledSetting() не работает надежно для AppWidgets во всех версиях Android. Отчет об ошибке находится здесь: issuetracker.google.com/issues/36914010

4. не работает.. во время выполнения он не включает приемник

5. @String Теперь ошибка исправлена!!

Ответ №2:

 PackageManager packageManager = getApplicationContext().getPackageManager();
//To disable widget
packageManager.setComponentEnabledSetting(new ComponentName(getApplicationContext(), MyAppWidgetProvider.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
//To enable widget
packageManager.setComponentEnabledSetting(new ComponentName(getApplicationContext(), MyAppWidgetProvider.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
 

Комментарии:

1. Пожалуйста, рассмотрите возможность добавления объяснения к общему фрагменту кода.

2. это работает.. но для отключения виджета требуется некоторое время

3. Сбой приложения, вызванный: java.lang. Исключение IllegalArgumentException: класс компонента не существует.