9

Ich habe eine App, die nach Telefonbenachrichtigungen lauscht und eine Nachricht an eine Android Wear-Uhr über die MessageApi sendet. Alles funktioniert gut, bis auf einige Geräte mit Android 6, vor allem Huawei Mate 8 (sieht aus wie alle Huawei Android 6 dies tun).NotificationListenerService- und Doze-Modus und App Standby

Huawei hat eine eigene Implementierung der Hintergrundverarbeitung von Freeze-Apps (Protected Apps). Aus den Benutzerberichten habe ich bestätigt, dass meine App eine Ausnahme in den geschützten Apps von Huawei und auch im Doze Modus von Android 6 hat. Die App funktioniert OK, aber nach genau 15 Minuten mit Display aus hört meine App auf, Nachrichten an die verbundene Android Wear-Uhr zu senden. Meine App kann auch den Verlauf der empfangenen Benachrichtigungen aufzeichnen und nach 15 Minuten kommt nichts an ... bis das Display des Telefons eingeschaltet wird und meine App geöffnet wird. Danach kommen alle Benachrichtigungen, die angekommen sein sollten, während das Display des Telefons ausgeschaltet war, in meine NotificationListenerService Implementierung und werden auf einmal an die Uhr gesendet. Dies wird auch durch die aufgezeichnete Historie bestätigt.

Irgendwelche Ideen, wie das für diese Telefone zu beheben, vor allem das Huawei Mate 8 mit Android 6 mit Doze-Modus?

Was ist das korrekte Verhalten der NotificationListenerService, während sich das Gerät im Schlafmodus befindet und/oder sich die App im Standby-Modus befindet?

EDIT

Benutzer haben auch bestätigt, dass ihre Telefone nicht in einem Energiesparmodus sind die auch Hintergrund-Anwendungen und ihre Dienste auswirkt. Dieser Fehler sieht aus wie Huawei exklusiv, weil keine Nexus-Benutzer dies gemeldet haben und mein OnePlus One mit M tut dies auch nicht. Auch die N-Vorschau funktioniert auf Nexus-Geräten gut.

EDIT 2

Ich habe einen optionalen Vordergrund Dienst (startForeground()) so meine app hat eine permanente Benachrichtigung im Infozentrum hinzugefügt, so sollte meine App von jeder Batterie Optimierung ausgeschlossen werden. Für die Vordergrunddienstbenachrichtigung verwendete ich eine Priorität von NotificationCompat.PRIORITY_MIN und ich fügte das Notification.FLAG_ONGOING_EVENT Flag hinzu. Dies half ein wenig auf den Huawei-Handys, aber nicht viel, jetzt kommen die verzögerten Benachrichtigungen in meine NotificationListenerService direkt nach dem Einschalten des Bildschirms statt nach dem Öffnen meiner App. Ich verwende nicht die startForeground() in meinem NotificationListenerService, sondern in einem anderen Service, weil ich keine Kontrolle über seinen Lebenszyklus habe.

Antwort

0

Ich wusste nicht über Android Doze-Modus, bis ich Ihren Beitrag sah. Dann lese ich this article und es scheint so, als ob es funktionieren soll! Wenn Sie im Doze-Modus Benachrichtigungen erhalten möchten, versuchen Sie PRIORITY_HIGH oder PRIORITY_MAX für Ihre Benachrichtigungspriorität, aber selbst wenn es funktioniert, scheint es nicht wirklich eine vollständige Lösung gemäß dem Artikel zu sein.

+0

Dieser Artikel ist über Push-Benachrichtigungen und nicht die lokale Benachrichtigungen. Ich habe keinen Server für meine App, er ist komplett offline, sodass ich das Telefon nicht über Push-Benachrichtigungen mit hoher Priorität wecken kann. Es ist auch unmöglich, eine Push-Benachrichtigung an ein Telefon zu senden, wenn das Telefon eine Benachrichtigung zeigt ... – shelll

+0

Laut dem Artikel, ja Sie können das Gerät nicht wecken – NecipAllef

2

Für Huawei-Geräte (nicht sicher, ob dies für alle Huawei-Geräte gilt) müssen Sie die Berechtigung für geschützte Apps anfordern, damit Ihre App nicht eingefroren wird, wenn sie in den Hintergrund tritt.

zu erkennen, ob ein Huawei-Gerät hat die Erlaubnis Protected Apps:

private boolean hasProtectedAppsSetting() { 
    Intent intent = new Intent(); 
    intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"); 

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

zu bringen Huawei Apps Einstellungen Seite Geschützt:

private void showProtectedAppsSetting() { 
    try { 
     String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity"; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      cmd += " --user " + getUserSerial(); 
     } 
     Runtime.getRuntime().exec(cmd); 
    } catch (IOException ignored) { 
    } 
} 

private String getUserSerial() { 
    //noinspection ResourceType 
    Object userManager = getSystemService("user"); 
    if (null == userManager) return ""; 

    try { 
     Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null); 
     Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null); 
     Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass()); 
     long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle); 
     return String.valueOf(userSerial); 
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) { 
    } 
    return ""; 
} 

Leider, wenn der Benutzer zu überprüfen, ich habe keine Möglichkeit gefunden habe deine App als geschützte App gewährt. Bitte teilen, wenn jemand weiß :)

Referenz: http://ndroid.info/ldquo_protected_appsrdquo_setting_on_huawei_phones_and_how_to_handle_it

+0

Vielen Dank für diese Information. Aber, wie in der Frage erwähnt, ist das Problem, dass selbst das Auslösen meiner App in den Protected Apps von Huawei das "Einfrieren des Hintergrunds" nicht löst. Selbst mit Deaktivierung der nativen Akku-Optimierung von Android 6 und einem Vordergrund-Service. Für einige Benutzer reicht es aus, eine Ausnahme sowohl für geschützte Apps als auch für die Akku-Optimierung hinzuzufügen, aber nicht für alle. Nicht einmal für die Mehrheit. – shelll