it-roy-ru.com

Android O - однолинейное уведомление - например, "Система Android - USB зарядка этого устройства"

Я хотел бы получать текущее уведомление для моей ForegroundService, которое требует как можно меньшего места. Мне нравится стиль "Android System - USB-зарядка этого устройства", но я не могу найти никакого примера, как этого добиться .  enter image description here

Может кто-то указать мне верное направление?

Обновление

Стиль присваивается уведомлению, если каналу присвоено значение IMPORTANCE_MIN.

Похоже, что нельзя использовать встроенные в Android-стиль уведомления для использования IMPORTANCE_MIN с ForegroundService.

Вот описание IMPORTANCE_MIN:

Минимальное значение уведомления: отображается только в тени, ниже сгиба. Это не должно использоваться с Service.startForeground, так как предполагается, что служба переднего плана - это то, о чем заботится пользователь, поэтому не имеет смысла обозначать свое уведомление как минимальное значение. Если вы сделаете это начиная с версии Android Build.VERSION_CODES.O, система покажет уведомление с более высоким приоритетом о том, что ваше приложение работает в фоновом режиме.

21
Sobvan

Чтобы ответить на оригинальный вопрос:

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

Однако есть надежда :)

OnAndroid Pуведомление в NotificationChannel из IMPORTANCE_LOW с приоритетом PRIORITY_LOW is сжато в одну строку даже для ForegroundService. Да уж!!

0
Sobvan

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

@TargetApi(Build.VERSION_CODES.O)
private static void createFgServiceChannel(Context context) {
   NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN);
   NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
   mNotificationManager.createNotificationChannel(channel);
}

И затем создайте текущее уведомление как это:

public static Notification getServiceNotification(Context context) {
   NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id");
   mBuilder.setContentTitle("One line text");
   mBuilder.setSmallIcon(R.drawable.ic_notification);
   mBuilder.setProgress(0, 0, true);
   mBuilder.setOngoing(true);
   return mBuilder.build();
}

НОТА 

Обратите внимание, что я протестировал его с IntentService вместо Service, и он работает. Также я только что проверил настройку Thread.sleep() на 15 секунд, и уведомление показывается отлично, пока IntentService не останавливается.

Есть некоторые изображения (извините, некоторые тексты на испанском языке, но я думаю, что изображения все еще полезны):

 Single line ongoing notification

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

 Single line ongoing notification opened

EXTRA

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

Взгляните на это:

 Battery applications

Просто нажмите на это уведомление и выберите ВСЕ КАТЕГОРИИ:

 Chennel notification for battery applications

И установите значение LOW:

 enter image description here

В следующий раз это уведомление о «расходе заряда батареи» будет отображаться как уведомление о зарядке.

4
Marc Estrada

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

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

private static final int MYAPP_NOTIFICATION_ID= -793531;

NotificationManager notificationManager = (NotificationManager) context
        .getSystemService(Context.NOTIFICATION_SERVICE);

String CHANNEL_ID = "myapp_ongoing";
CharSequence name = context.getString(R.string.channel_name_ongoing);

if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN);
    channel.setShowBadge(false);

    notificationManager.createNotificationChannel(channel);
}

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
        context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_stat_notification_add_reminder)
        .setContentTitle(context.getString(R.string.app_name))
        .setContentText(context.getString(R.string.create_new))
        .setOngoing(true).setWhen(0)
        .setChannelId(CHANNEL_ID)
        .setPriority(NotificationCompat.PRIORITY_MIN);

// Creates an intent for clicking on notification
Intent resultIntent = new Intent(context, MyActivity.class);
...

// The stack builder object will contain an artificial back stack
// for the
// started Activity.
// This ensures that navigating backward from the Activity leads out
// of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(MyActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
        PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);

notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build());
2
CodeChimp

Расширяемое уведомление

По умолчанию текстовое содержимое уведомления усекается до одной строки. Если вы хотите, чтобы ваше уведомление было длиннее, вы можете включить большую текстовую область, которую можно расширить, применив дополнительный шаблон.

Кроме того, Android 4.1 поддерживает расширяемые уведомления. В дополнение к обычному представлению уведомлений можно определить большое представление, которое будет отображаться при расширении уведомления. В большом представлении можно использовать три стиля: стиль большого изображения, стиль большого текста, стиль «Входящие». Следующий код демонстрирует использование BigTextStyle (), который позволяет использовать до 256 dp.

Например :

String longText = "...";

Notification noti = new Notification.Builder(this)
.....
.....
.....
.setStyle(new Notification.BigTextStyle().bigText(longText))
0
Viral Patel