К сожалению, это было ограничение уведомлений Firebase в SDK 9.0.0-9.6.1. Когда приложение находится в фоновом режиме, значок манифеста используется из манифеста (с требуемым оттенком Android) для сообщений, отправленных с консоли.
С SDK 9.8.0 вы можете переопределить значение по умолчанию! В вашем AndroidManifest.xml вы можете установить следующие поля для настройки значка и цвета:
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/google_blue" />
Обратите внимание, что если приложение находится на переднем плане (или отправлено сообщение с данными), вы можете полностью использовать свои собственную логику для настройки дисплея. Вы также можете всегда настраивать значок, отправляя сообщение из API HTTP / XMPP.
Взгляните на эту запись в блоге: ОБНОВЛЕНИЕ ОБЛАСТИ УВЕДОМЛЕНИЙ ТАСКБАРА . Я использую этот код для обновления панели задач, чтобы избавиться от потерянных значков, и он отлично работает. Запись в блоге очень информативна и дает прекрасное объяснение шагов, которые автор выполнил, чтобы найти свое решение.
#define FW(x,y) FindWindowEx(x, NULL, y, L"")
void RefreshTaskbarNotificationArea()
{
HWND hNotificationArea;
RECT r;
GetClientRect(
hNotificationArea = FindWindowEx(
FW(FW(FW(NULL, L"Shell_TrayWnd"), L"TrayNotifyWnd"), L"SysPager"),
NULL,
L"ToolbarWindow32",
// L"Notification Area"), // Windows XP
L"User Promoted Notification Area"), // Windows 7 and up
&r);
for (LONG x = 0; x < r.right; x += 5)
for (LONG y = 0; y < r.bottom; y += 5)
SendMessage(
hNotificationArea,
WM_MOUSEMOVE,
0,
(y << 16) + x);
}
Включайте следующий код с Вашим для обновления Системного лотка.
public const int WM_PAINT = 0xF;
[DllImport("USER32.DLL")]
public static extern int SendMessage(IntPtr hwnd, int msg, int character,
IntPtr lpsText);
Send WM_PAINT Message to paint System Tray which will refresh it.
SendMessage(traynotifywnd, WM_PAINT, 0, IntPtr.Zero);
Насколько я знаю, что это не возможный Gustavo - это до каждого приложения, чтобы поместить его notifyicon в systray и гарантировать, что это сохранено в правильном состоянии.
Вы будете замечать иногда, когда катастрофические отказы explorer.exe, что определенные значки не вновь появляются - это не то, потому что их процесс отказал, просто что их приложение не поместило notifyicon в systray когда новый экземпляр запущенного explorer.exe. Еще раз это - приложение, это ответственно.
Извините, что не имел лучшие новости для Вас!
Я использую следующий код C++ для получения дескриптора окна к окну лотка.Примечание: это было только протестировано на Windows XP.
HWND FindSystemTrayIcons(void)
{
// the system tray icons are contained in a specific window hierarchy;
// use the Spy++ utility to see the chain
HWND hwndTray = ::FindWindow("Shell_TrayWnd", "");
if (hwndTray == NULL)
return NULL;
HWND hwndNotifyWnd = ::FindWindowEx(hwndTray, NULL, "TrayNotifyWnd", "");
if (hwndNotifyWnd == NULL)
return NULL;
HWND hwndSysPager = ::FindWindowEx(hwndNotifyWnd, NULL, "SysPager", "");
if (hwndSysPager == NULL)
return NULL;
return ::FindWindowEx(hwndSysPager, NULL, "ToolbarWindow32", "Notification Area");
}
В прошлом году я освещал эту проблему в своем блоге Codeaholic в статье под названием [Delphi] Обновление SysTray .
Мое решение - Delphi ActiveX / COM DLL. Ссылка для загрузки по-прежнему работает (хотя я не знаю, сколько еще времени, поскольку мое членство в PLUG истекло).