9

Ho un'app che ascolta le notifiche del telefono e invia un messaggio a un orologio Android Wear tramite lo MessageApi. Tutto funziona bene tranne alcuni dispositivi con Android 6, in particolare Huawei Mate 8 (sembra che tutti gli Huawei Android 6 lo facciano).NotificationListenerService e modalità Doze e App Standby

Huawei ha la propria implementazione dell'elaborazione in background delle applicazioni di blocco (app protette). Dai rapporti degli utenti ho confermato che la mia app ha un'eccezione nelle app protette di Huawei e anche nella modalità Doze di Android 6. L'app funziona correttamente, ma dopo esattamente 15 minuti con il display spento la mia app interrompe l'invio di messaggi all'app Android Wear collegato. La mia app può anche registrare la cronologia delle notifiche ricevute e nulla arriva dopo i 15 minuti ... finché il display del telefono non è acceso e la mia app è aperta. Dopo che tutte le notifiche che dovrebbero essere arrivate mentre il display del telefono era spento arrivano alla mia implementazione NotificationListenerService e vengono inviate all'orologio, tutte in una volta. Questo è anche confermato dalla cronologia registrata.

Qualche idea su come risolvere questo problema con questi telefoni, in particolare l'Huawei Mate 8 con Android 6 con modalità Doze?

Qual è il comportamento corretto di NotificationListenerService mentre il dispositivo è in modalità doze e/o l'app è in modalità standby?

EDIT

Gli utenti hanno anche confermato che i loro telefoni non sono in una modalità di risparmio energetico che interessa anche applicazioni in background e dei loro servizi. Questo bug sembra Huawei esclusivo perché nessun utente Nexus ha segnalato questo e il mio OnePlus One con M non lo sta facendo. Anche l'anteprima N funziona bene sui dispositivi Nexus.

EDIT 2

Ho aggiunto un servizio di primo piano opzionale (startForeground()) quindi la mia applicazione ha una notifica permanente nel centro di notifica, quindi la mia app devono essere esclusi da ogni ottimizzazione della batteria. Per la notifica del servizio in primo piano ho utilizzato una priorità di NotificationCompat.PRIORITY_MIN e ho aggiunto il flag Notification.FLAG_ONGOING_EVENT. Questo ha aiutato un po 'i telefoni Huawei, ma non molto, ora le notifiche in ritardo arrivano nel mio NotificationListenerService subito dopo l'accensione dello schermo, invece dopo aver aperto la mia app. Non uso lo startForeground() nel mio NotificationListenerService ma in un altro Service perché non ho alcun controllo sul suo ciclo di vita.

risposta

0

Non conoscevo la modalità Doze di Android fino a quando non ho visto il tuo post. Poi ho letto this article e sembra che sia così che dovrebbe funzionare! Se si desidera ricevere notifiche durante la modalità Doze, provare a utilizzare PRIORITY_HIGH o PRIORITY_MAX per la priorità di notifica, ma anche se funziona, non sembra davvero una soluzione completa in base all'articolo.

+0

Questo articolo è circa le notifiche push e notifiche non locali. Non ho un server per la mia app, è completamente offline, quindi non posso riattivare il telefono tramite notifica push ad alta priorità. Sarà anche impossibile inviare una notifica push a un telefono quando quel telefono mostra una notifica ... – shelll

+0

Secondo l'articolo, sì, non si sarà in grado di riattivare il dispositivo – NecipAllef

2

Per i dispositivi Huawei (non è sicuro se si applica a tutti i dispositivi Huawei), è necessario richiedere l'autorizzazione per le app protette affinché l'app non venga bloccata quando viene messa in background.

Per rilevare il permesso Apps se un dispositivo Huawei ha Protetto:

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

Per far apparire Huawei Protected Apps pagina delle impostazioni:

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 ""; 
} 

Purtroppo non ho trovato alcun modo per verificare se l'utente hai concesso la tua app come app protetta. Si prega di condividere se qualcuno sa :)

Riferimento: http://ndroid.info/ldquo_protected_appsrdquo_setting_on_huawei_phones_and_how_to_handle_it

+0

Grazie per questa informazione. Ma, come accennato nella domanda, il problema è che anche il fatto di dare un'app alla mia app un'eccezione nelle App protette di Huawei non risolve il "blocco dello sfondo". Anche insieme alla disabilitazione dell'ottimizzazione nativa della batteria di Android 6 oltre a un servizio in primo piano. Per alcuni utenti è sufficiente aggiungere un'eccezione alle app protette e all'ottimizzazione della batteria, ma non per tutti. Neanche per la maggioranza. – shelll