wake-up-neo.com

Android O - Einzeilige Benachrichtigung - wie "Android System - USB lädt dieses Gerät"

Ich möchte eine laufende Benachrichtigung für meine ForegroundService haben, die einen möglichst kleinen Platz erfordert. Ich mag den Stil "Android System - USB, der dieses Gerät auflädt", aber ich kann kein Beispiel finden, wie dies erreicht werden kann .  enter image description here

Kann mir jemand die richtige Richtung zeigen?

Aktualisieren

Der Stil wird der Benachrichtigung zugewiesen, wenn dem Kanal die Wichtigkeit IMPORTANCE_MIN zugewiesen wird.

Offenbar gibt es keine Möglichkeit, Androids zu verwenden, um Benachrichtigungen über IMPORTANCE_MIN mit einer ForegroundService zu verwenden.

Hier ist die Beschreibung von IMPORTANCE_MIN:

Min Benachrichtigungswert: nur im Schatten, unterhalb der Falte. Dies sollte nicht mit Service.startForeground verwendet werden, da es sich beim Benutzer um einen Vordergrunddienst handeln sollte. Daher ist es nicht sinnvoll, die Benachrichtigung als minimal zu markieren. Wenn Sie dies ab der Android-Version Build.VERSION_CODES.O tun, zeigt das System eine Benachrichtigung mit höherer Priorität über die Ausführung der App im Hintergrund an.

21
Sobvan

Um die ursprüngliche Frage zu beantworten:

In Android O scheint es keine integrierte Möglichkeit zu geben, eine fortlaufende Benachrichtigung für eine ForegroundService zu erhalten. Man könnte versuchen, ein benutzerdefiniertes Design hinzuzufügen, aber da verschiedene Telefone unterschiedliche Designs für die Benachrichtigung haben, ist diese Lösung kaum eine gute Lösung.

Es gibt jedoch Hoffnung :)

Am Android P wird die Benachrichtigung in einer NotificationChannel von IMPORTANCE_LOW mit einer Priorität von PRIORITY_LOWist zu einer einzelnen Zeile komprimiert, selbst für eine ForegroundService. Ja!!

0
Sobvan

Um eine kompakte einzeilige Benachrichtigung wie die Gebührenbenachrichtigung anzuzeigen, müssen Sie einen Notification Channel mit Priorität auf IMPORTANCE_MIN erstellen. 

@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);
}

Und dann eine solche Benachrichtigung erstellen:

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();
}

HINWEIS 

Bitte beachten Sie, dass ich es mit einer IntentService anstelle einer Service getestet habe und es funktioniert. Ich habe auch gerade die Einstellung einer Thread.sleep() von 15 Sekunden geprüft und die Benachrichtigung wird perfekt angezeigt, bis die IntentService sich selbst stoppt.

Es gibt einige Bilder (leider sind einige Texte auf Spanisch, aber ich denke, die Bilder sind immer noch nützlich):

 Single line ongoing notification

Wenn Sie die Benachrichtigung nach unten ziehen und öffnen, wird sie wie folgt angezeigt:

 Single line ongoing notification opened

EXTRA

Wenn Sie feststellen, dass das Android-System eine Benachrichtigung anzeigt, die alle Apps angibt, die den Akku verwenden (Apps mit laufenden Diensten), können Sie die Priorität dieser Art von Benachrichtigungen herabstufen. Diese Benachrichtigung wird als einzeilige Benachrichtigung wie die Lademeldung angezeigt.

Schau dir das an:

 Battery applications

Klicken Sie einfach lange auf diese Benachrichtigung und wählen Sie ALLE KATEGORIEN:

 Chennel notification for battery applications

Und legen Sie die Wichtigkeit auf LOW:

 enter image description here

Beim nächsten Mal wird diese Benachrichtigung über den "Batterieverbrauch" als Lademeldung angezeigt.

4
Marc Estrada

Sie müssen die Benachrichtigungspriorität auf Min, die Wichtigkeit des Benachrichtigungskanals auf Min einstellen und die Anzeige des Benachrichtigungskanal-Badges deaktivieren.

Hier ist ein Beispiel, wie ich das mache. Ich habe das Erstellen der vollständigen Benachrichtigung als Referenz hinzugefügt

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

Erweiterbare Benachrichtigung

Standardmäßig wird der Textinhalt der Benachrichtigung auf eine Zeile gekürzt. Wenn Ihre Benachrichtigung länger sein soll, können Sie einen erweiterten Textbereich aktivieren, der erweitert werden kann, indem Sie eine zusätzliche Vorlage anwenden.

Darüber hinaus unterstützt Android 4.1 erweiterbare Benachrichtigungen. Zusätzlich zur normalen Benachrichtigungsansicht kann eine große Ansicht definiert werden, die angezeigt wird, wenn die Benachrichtigung erweitert wird. Es gibt drei Stile, die mit der großen Ansicht verwendet werden können: Großbildstil, großer Textstil, Posteingangsstil. Der folgende Code demonstriert die Verwendung von BigTextStyle (), wodurch bis zu 256 dp verwendet werden können.

Zum Beispiel :

String longText = "...";

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

Ich habe die Größe der Vordergrunddienstbenachrichtigung verkleinert, indem ich eine leere benutzerdefinierte Ansicht wie die folgende erstellt habe:

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


</LinearLayout>

und dann die Benachrichtigung wie folgt erstellen:

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);

Dies hilft bei der Reduzierung der Höhe der Benachrichtigung, aber ich bin nicht sicher, wie das Benachrichtigungssymbol ausgeblendet werden soll.

0
Jazib Khan