#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/369140104. не работает.. во время выполнения он не включает приемник
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: класс компонента не существует.