2015-05-21 16 views
12

Il mio requisito è: dopo che un messaggio GCM arriva, il dispositivo dovrebbe svegliarsi per visualizzare una notifica ad alta priorità. Il dispositivo dovrebbe accendere lo schermo su.qual è il modo corretto e non deprecato per riattivare il dispositivo?

Attualmente sto usando WakeLock per raggiungere questo obiettivo. Il metodo newWakeLock() prevede un livello di blocco E un flag da passare (come il primo parametro, bit per bit o d).

Uso il flag PowerManager.ACQUIRE_CAUSES_WAKEUP poiché fa esattamente ciò di cui ho bisogno. Tuttavia, sono un po 'frustrato per il livello di blocco. Quindi, secondo il docs, ho ottenuto le seguenti opzioni:

  • PARTIAL_WAKE_LOCK - non compatibili con ACQUIRE_CAUSES_WAKEUP/non si accende lo schermo su
  • SCREEN_DIM_WAKE_LOCK - deprecato
  • SCREEN_BRIGHT_WAKE_LOCK - deprecato
  • FULL_WAKE_LOCK - deprecato

Il suggerimento FLAG_KEEP_SCREEN_ON è completamente inutile in questa scena rio. Ho finito solo sopprimendo l'avviso deprecazione:

@SuppressWarnings("deprecation") 
PowerManager.WakeLock screenOn = ((PowerManager) c.getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); 
screenOn.acquire(); 
mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
screenOn.release(); 

La domanda: esiste un modo affidabile non deprecato per riattivare il dispositivo nel caso descritto?

EDIT Non sto chiedendo soluzioni alternative per riattivare il dispositivo. La mia domanda è se questo è possibile svegliarsi il dispositivo dallo sfondo (senza correre Activity) senza l'utilizzo di API ritirate

+0

correlati: http://stackoverflow.com/questions/30246425/turning-on-screen-from-reciever-service –

+0

@Mr_and_Mrs_D grazie per il link, ma la risposta accettata non è adatto per il mio caso, in quanto Non ho un oggetto 'Window' mentre l'app è in background e non sono in esecuzione' Attività'. Quindi, sto ancora cercando una risposta – Droidman

risposta

9

utilizzare il codice che ho ricevuto da mia domanda, e poi basta finire l'attività, dovrebbe lasciare il schermo per gli utenti normale quantità di tempo. Fidati di me questo è l'unico modo, dopo aver trascorso una buona settimana su questo problema. Puoi sempre impostare l'attività in modo trasparente con notitlebar, l'utente non lo saprà mai.

 @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
      finish(); 
    } 
+0

Non sono sicuro di lanciare un 'Activity' solo per riattivare il dispositivo è il modo corretto ed efficiente. E sicuramente non sono sicuro che Google lo consideri nel modo corretto. Ho aggiornato la domanda per chiarire. – Droidman

+0

Ok, in tal caso la risposta è no. Ho passato giorni a provarlo in quel modo. So aprire e chiudere l'attività all'interno di oncreate. Ho cercato dappertutto un'altra soluzione, non esiste – RuAware

+0

Questa è l'unica soluzione non-wakelock che ho trovato anche io ... Sono d'accordo che questo non è il migliore, ma finché non ne abbiamo un altro (non -deprecated) questa è la soluzione a cui siamo obbligati ..... – Aenadon

Problemi correlati