2012-01-20 10 views
8

Hi Stackoverflowers (lo so, non sembra che dovrebbe ...)Su Android, viene visualizzata la finestra di dialogo del sistema (opzioni di alimentazione, app recenti, batteria scarica ...)?

Beh penso che è quasi tutto nella domanda: mi piacerebbe prendere qualsiasi cosa che causa la visualizzazione della mia attività per ottenere anche parzialmente nascosto, ad es opzioni di alimentazione, barra delle applicazioni recenti, notifica di batteria scarica, ecc. e ho difficoltà a rilevare questi eventi di sistema.

ero abbastanza sicuro onPause() sarebbe chiamato quando tali eventi accadono, ma sembra essere sbagliato ... o sono io?

Qualsiasi altra idea? ... mi piacerebbe preferibilmente non gancio su ogni azione di sistema di trasmissione individualmente, dal momento che mi piacerebbe essere il più generico possibile (e reagire a tutto ciò che nasconde la mia attività).

Grazie per qualsiasi input!

+1

Strano. Come per i documenti * onPause() * dovrebbe essere solo la strada da percorrere: "In pausa: un'altra attività è in primo piano e ha il focus, ma questa è ancora visibile.Cioè, un'altra attività è visibile in cima a questa e quella attività è parzialmente trasparente o non copre l'intero schermo. " – JimmyB

+0

Sì, penserei che onPause() dovrebbe funzionare come vuoi. Se sì, quale dispositivo stai utilizzando e quali finestre di sistema specificamente hai visto che non attivano il tuo onPause()? – FoamyGuy

+0

Altrettanto increduli come voi, ma sto testando su una vasta gamma di dispositivi (HTC/Samsung/Sony Ericsson) nessuno dei quali chiama onPause() quando faccio un lungo clic sul pulsante di accensione o sul pulsante Home. Tuttavia onPause() viene chiamato se faccio semplicemente clic su di essi! Mi batte ... – Wouzz

risposta

0

Ero abbastanza sicuro che onPause() verrebbe chiamato quando accadono tali eventi, ma sembra che sia sbagliato ... o sono io?

onPause() verrà chiamato se un'altra attività riprende l'input in primo piano. Pertanto, se un'app di terze parti è arrivata in primo piano, anche con un'attività a tema di dialogo, verrà chiamato onPause().

Non v'è alcun obbligo per onPause() di essere chiamato da componenti del sistema operativo, però.

io non avevo preferibilmente gancio sulla ogni azione sistema di trasmissione individualmente, dal momento che mi piacerebbe essere il più generico possibile (e reagire a tutto ciò che nasconde la mia attività).

Quello che vuoi non è possibile. Non tutte le cose che hanno trasmesso la lista Intents, e ci sono altre tecniche che le persone possono utilizzare (per esempio, Toasts) che sarà oscurare parte della vostra attività di cui si avrà alcuna conoscenza.

+0

Hi CommonsWar e, grazie per la tua risposta :) Buon punto, in realtà non devo preoccuparmi di Toasts. Ma è strano per me che non possiamo reagire agli eventi che mostrano livelli a schermo intero, come il vassoio "app recenti" o quello "power options", che sfocano e oscurano lo sfondo ... Forse posso spiegare il mio caso d'uso specifico: lavoro su un lettore video e tutto ciò che voglio è mettere in pausa la riproduzione quando non è visibile all'utente. È troppo chiedere? ... – Wouzz

+1

@Wouzz: Immagino che sia in parte un po 'una misura di sicurezza, quindi il malware non rileva questi eventi e fa apparire la propria cosa oltre l'altra cosa in un tentativo di ingannare gli utenti. Mentre il tuo obiettivo è nobile, mi concentrerei semplicemente su una comoda opzione di riavvolgimento per 10 secondi, così gli utenti che sentono di aver perso qualcosa possono facilmente tornare indietro nel tempo. – CommonsWare

7

Su lavorando su un app stile chiosco So che alcune finestre di dialogo vengono al primo piano e può essere rilevato da

ActivityManager activityManager = (ActivityManager)getBaseContext() 
     .getSystemService(Activity.ACTIVITY_SERVICE); 
    String className = activityManager.getRunningTasks(1).get(0).topActivity.getClassName(); 

Un esempio per questo è il dialogo bluetooth vincolante che porta le com.android.settings in primo piano.

Un contro-esempio è la finestra di dialogo del pulsante di alimentazione (Spegnere, Riavviare ecc) che non arriva al primo piano.

Si noti che è possibile chiudere le finestre di dialogo di sistema (anche la finestra di dialogo del pulsante di alimentazione) con questa trasmissione:

Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
     sendBroadcast(closeDialog); 

Ma sulla maggior parte (? Tutti i più recenti) i dispositivi questa trasmissione sarà anche chiudere la tastiera software, in modo da non è consigliabile avere un servizio in esecuzione che lo invia di frequente poiché l'utente non sarà in grado di inserire nulla in un campo di testo.

Nota che tale comportamento sarà sicuramente soddisfare la vostra applicazione di una condizione come beeing di malware, mantenendolo dal beeing pubblicato sul gioco google.