Есть ли способ динамически изменять значок приложения Android, как это делает приложение Calendar?

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

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

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

3 ответов


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

что вы подразумеваете под крючки?

например, Samsung может отправить приложение календаря Samsung на устройствах Samsung. Домашний экран Samsung на тех же устройствах Samsung может иметь специальные правила для рендеринга значка для приложения календаря Samsung, правила, которые включают показ дня месяц. Это потому, что Samsung написал домашний экран. Если вы устанавливаете сторонний домашний экран, он может не делать то же самое. В конце концов, я могу написать домашний экран через час или около того, и я уверен, что мне не нужно делать ничего особенного для приложения календаря Samsung.

ничто не мешает Samsung подвергать какой-то API, чтобы позволить разработчикам подключаться к домашнему экрану Samsung и уведомлять его о таких вещах. Будет Ли Samsung планирует для третьи стороны используют этот API, или это кто-то взламывает, как Samsung делает это для своих собственных приложений, я не могу сказать.

(кстати, я цитирую Samsung здесь в качестве возможного примера - я не знаю, что у них на самом деле есть такая функция, и если да, то на каких устройствах она есть)

Я, кажется, помню, что у кого-то есть проект GitHub, который пытается обернуть проприетарные API различных домашних экранов. IIRC, некоторые поддерживаемые возможности включали либо замену приложения значок или добавление значка (например, количество непрочитанных сообщений). Однако:

  • только небольшой процент устройств будет поддерживать эти проприетарные API

  • недокументированные и неподдерживаемые API, обнаруженные с помощью приложений обратного проектирования, могут быть изменены и могут сломаться неожиданными способами

Я совершенно уверен, что в Android SDK нет ничего, что поддерживает динамические значки приложений. Единственное, что я знаю, что люди пробовали, использует <activity-alias> иметь N различных "действий", все указывающие на одну и ту же реализацию, но имеющие разные значки. Используя PackageManager и setComponentEnabledSetting(), приложение отключает старый псевдоним запуска и включает другой, в надежде, что домашние экраны подберут это и покажут новый значок. Некоторые знают. Другие только узнают об изменении при перезагрузке.

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


У меня тот же вопрос, но ответ, приведенный здесь, не дает ответа.
У меня Google Pixel 2 С raw Android Ore 8.1 на плате и есть два приложения, которые меняются с течением времени:календарь и часы. Стрелки на часах часы app показать текущее время и номер на календарь значок соответствует сегодняшней дате месяца.
Так что с учетом того, что это по умолчанию launcher, вероятно существует некоторый API, чтобы сделать аналогичную вещь.

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


действительно, даже в ящике приложения в Android O значок приложения часов показывает текущее время, а значок приложения календаря показывает текущий день месяца.

эта статья объясняет:

Крис Лейси, разработчик за хорошо известной пусковой установки действий, обнаружил что-то в файле APK приложения Clock, который поставляется в Android O: манифест.xml упоминает часы, минуты и секунды как слои со значениями по умолчанию, а значок имеет отдельные изображения для фона и различных элементов.

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

похоже, что Pixel launcher выбирает различные ресурсы слоя изображения значков в зависимости от времени и даты.