Я хотел бы получить постоянное уведомление о моем ForegroundService
которое требует как можно большего места. Мне нравится стиль "Android System - USB зарядка этого устройства", но я не могу найти никакого примера, как это сделать. ![enter image description here]()
Может кто-то указать мне верное направление?
Обновить
Стиль присваивается уведомлению, если каналу присвоено значение IMPORTANCE_MIN
.
Похоже, что нет возможности использовать андроиды, встроенные в стиль для уведомлений IMPORTANCE_MIN
которые будут использоваться с ForegroundService
.
Вот описание IMPORTANCE_MIN
:
Минимальное значение уведомления: только показывает в тени, под складкой. Это не должно использоваться с Service.startForeground, поскольку служба переднего плана должна быть чем-то, о чем заботится пользователь, поэтому семантический смысл не означает, что его уведомление является минимальным значением. Если вы сделаете это с версии Android Build.VERSION_CODES.O, система покажет уведомление с более высоким приоритетом о вашем приложении, работающем в фоновом режиме.
Ответ 1
Чтобы ответить на исходный вопрос:
Похоже, на Android O нет встроенного способа, чтобы получить одну строку, текущее уведомление для ForegroundService
. Можно попробовать добавить пользовательский дизайн, но поскольку разные телефоны имеют разные конструкции для уведомления, это решение вряд ли является хорошим.
Есть надежда, однако :)
На Android P уведомление в NotificationChannel
из IMPORTANCE_LOW
с приоритетом PRIORITY_LOW
уплотняется к одной линии даже для ForegroundService
. Да уж!!
Ответ 2
Чтобы отобразить компактное однострочное уведомление, такое как уведомление об оплате, вам необходимо создать 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]()
В следующий раз это уведомление об "потреблении батареи" будет отображаться как уведомление о тарификации.
Ответ 3
Вам необходимо установить приоритет уведомлений как Min, Notification Channel значение 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());
Ответ 4
Расширяемое уведомление
По умолчанию текстовое содержимое уведомлений усекается, чтобы поместиться в одну строку. Если вы хотите, чтобы ваше уведомление было длиннее, вы можете включить большую текстовую область, расширяемую, применяя дополнительный шаблон.
Кроме того, Android 4.1 поддерживает расширяемые уведомления. В дополнение к обычным уведомлениям можно определить большой вид, который отображается при расширении уведомления. Существует три стиля для большого представления: стиль большой картинки, стиль большого текста, стиль "Входящие". Следующий код демонстрирует использование BigTextStyle(), которое позволяет использовать до 256 дп.
Например :
String longText = "...";
Notification noti = new Notification.Builder(this)
.....
.....
.....
.setStyle(new Notification.BigTextStyle().bigText(longText))
Ответ 5
Попробуйте это, я уже использовал приложение.
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import java.lang.reflect.Method;
public static Notification getForegroundNotification(Context context) {
Notification notification = new NotificationCompat.Builder(context)
.setContentTitle(context.getString(R.string.app_name))
.setContentText("Notification text")
.setAutoCancel(false)
.setPriority(Notification.PRIORITY_MAX)
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.setOngoing(true)
.build();
return notification;
}