Мои хедз-ап уведомления отправляются из службы переднего плана. Они нормально работают в нескольких старых новых версиях Android (4.4, 7.0, 9.0), за исключением Android 5, где всплывающее уведомление появляется, а затем «застревает» на экране.
Мой проект компилируется для Android версии 27 с minSdkVersion, установленным на 18.
Я создал свои каналы уведомлений с помощью IMPORTANCE_HIGH. Я создаю свои уведомления с помощью PRIORITY_HIGH и успешно создаю хедз-ап уведомления со звуком и вибрацией.
До сих пор я использовал один идентификатор уведомления для запуска уведомления службы переднего плана, а также для обновления того же уведомления новыми данными.
На моей платформе Android 5 отображается хедз-ап уведомления, а затем остается на экране. Я могу провести боком или вверх, чтобы переместить уведомление во всплывающее окно. Если я нажму на «застрявшее» уведомление, то уведомление ContentIntent сработает, и моя активность отобразится, но теперь уведомление Текущая службы переднего плана пропало ( Служба все еще работает ).
Пока что единственный способ отобразить правильное хедз-ап уведомление для платформы Android 5 - это использовать 2 разных идентификатора уведомления, один идентификатор для запуска службы переднего плана и второй идентификатор уведомления для обновления того же уведомления , с новыми данными. ( но это создает 2 уведомления )
Если я просто не запускаю Службу на переднем плане, то с помощью одного идентификатора уведомления отображается одно уведомление в виде заголовка, затем оно исчезает (, как и должно ) через 5 секунд.
@Override
public void onCreate() {
super.onCreate();
startForeground(NOTIFY_ID_SERVICE, createNotification(getString(R.string.CHANNEL_ID_FOUND),
getString(R.string.notification_title_default),
getString(R.string.msg_Service_is_enabled),
NotificationCompat.CATEGORY_SERVICE,
NotificationCompat.PRIORITY_DEFAULT,
false).build());
}
private NotificationCompat.Builder createNotification(String channelId, String title, String text, String category, int priority, boolean isOngoing) {
Intent resultIntent = new Intent(this, MainActivity.class);
resultIntent.setAction(Intent.ACTION_MAIN);
resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);
NotificationCompat.Builder builder = null;
try {
builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(GlobalApp.getAppContext().getApplicationInfo().icon)
.setContentTitle(title)
.setCategory(category)
.setContentText(text)
.setOngoing(isOngoing)
.setContentIntent(pendingIntent)
.setPriority(priority);
}
catch(Exception e)
{
Log.e(GlobalApp.getLogTag(), "createNotification error: " + e.getMessage());
}
return builder;
}
private void postNotification(boolean isFound, String elapsedTime) {
NotificationCompat.Builder builder;
try {
builder = createNotification(getString(R.string.CHANNEL_ID_FOUND),
getString(R.string.notification_title_default),
getString(R.string.msg_internet_found) + " Elapsed: " + elapsedTime,
NotificationCompat.CATEGORY_STATUS,
NotificationCompat.PRIORITY_HIGH,
false);
if (isFound) {
if(GlobalApp.isVibrateEnabled()) {
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
}
if(GlobalApp.getRingtoneFound() != null) {
builder.setSound(Uri.parse(GlobalApp.getRingtoneFound()));
} else {
builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
}
} else {
builder = createNotification(getString(R.string.CHANNEL_ID_LOST),
getString(R.string.notification_title_default),
getString(R.string.msg_internet_lost) + " Elapsed: " + elapsedTime,
NotificationCompat.CATEGORY_STATUS,
NotificationCompat.PRIORITY_HIGH,
false);
if(GlobalApp.getConnectionStatus() == GlobalApp.CONNECTION_STATUS_WIFI_LOST) {
builder.setContentText(getString(R.string.msg_wifi_lost) + " Elapsed: " + elapsedTime);
} else {
builder.setContentText(getString(R.string.msg_internet_lost) + " Elapsed: " + elapsedTime);
}
if(GlobalApp.getRingtoneLost() != null) {
builder.setSound(Uri.parse(GlobalApp.getRingtoneLost()));
} else {
builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
}
}
if(GlobalApp.isVibrateEnabled()) {
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
}
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(GlobalApp.getAppContext());
notificationManager.notify(NOTIFY_ID_SERVICE, builder.build());
}
catch(Exception e)
{
Log.e(GlobalApp.getLogTag(), "Notification error: " + e.getMessage());
}
}