Android O - однолинейное уведомление - например, «Система Android - USB зарядка этого устройства» - PullRequest
0 голосов
/ 04 июня 2018

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

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

Обновление

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 14 марта 2019

Я уменьшил размер уведомления службы переднего плана, создав пустое настраиваемое представление, например:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


</LinearLayout>

, а затем создав уведомление, подобное этому:

RemoteViews notifiactionCollapsed = new RemoteViews(getPackageName(),R.layout.notification_collapsed);
    Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
            .setSmallIcon(R.drawable.eq_icon)
            .setCustomContentView(notifiactionCollapsed)
            .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
            .setShowWhen(false)
            .setContentIntent(pendingIntent)
            .setPriority(NotificationCompat.PRIORITY_LOW)
            .setOngoing(true)
            .setVisibility(NotificationCompat.VISIBILITY_SECRET)
            .build();
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
            notification);

Это помогает вуменьшение высоты уведомления, но я не уверен, как скрыть значок уведомления.

0 голосов
/ 13 июня 2018

Для отображения компактного однострочного уведомления, такого как уведомление о платеже, необходимо создать 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

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

0 голосов
/ 05 июля 2018

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

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

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

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

0 голосов
/ 04 июня 2018

Вам нужно установить приоритет уведомлений на 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());
...