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

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

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

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

Ответ 1

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

Что вы понимаете под крючками?

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Resources res = activity.getPackageManager()
                            .getResourcesForApplication("com.google.android.calendar");
int resId = res.getIdentifier("logo_calendar_01_regular", "drawable"
                            , "com.google.android.calendar");
Drawable icon = res.getDrawable(resId);

Это позволит получить доступ к значку календаря на первый день месяца. Чтобы получить доступ в любой другой день, "logo_calendar_01_regular" будет изменен на текущий день. Например, день 7 будет "logo_calendar_07_regular". Также в календаре Google есть два стиля: "logo_calendar_01_regular" и "logo_calendar_01_round".

Также темы значков содержат отдельные значки для каждой даты.

Ответ 4

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

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

Ответ 5

Я разработчик пусковой установки.

Я не сделал ничего, связанного с динамическими иконками. Я просто получаю значки действий стандартным способом, предоставляемым Android API.

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

Устройство Nubia X работает под управлением Android 8.

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

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