2012-03-07 17 views
7

Sulla mia applicazione android per l'utente root, ho eseguire una chiusura conAndroid radice spegnimento

su reboot -p 

Funziona bene, ma ho notato che il telefono viene arrestato quasi istantaneamente (al contrario di mostrare l'animazione di spegnimento, e probabilmente facendo altre cose).

È questo il modo corretto di arrestare un telefono Android a livello di programmazione? Ci sono dei codici critici che devono essere eseguiti prima dell'arresto?

+0

@unforgettableid la modifica proposta è sia seriamente errate (le applicazioni non possono mai eseguito come root, solo al massimo nativo aiutanti), e relativamente inutile in quanto si tratta di una questione di 4 anni di basso valore che non necessita di essere rivista. –

+0

@ChrisStratton: Grazie per avermi corretto; Ho rivisto il mio suggerimento di modifica. Un commentatore GitHub ha appena fatto riferimento a questo thread Overflow dello stack in un [commento GitHub] (https://github.com/ppareit/Shutdown/issues/4#issuecomment-188899438) lo scorso febbraio. Sono d'accordo sul fatto che sia stato sciocco per il commentatore di GitHub fare riferimento a un thread così antico. Tuttavia, lo ha fatto riferimento. Poiché le risposte erano così vecchie, qualcun altro sprecava il proprio tempo impegnandosi in modo subottimale in un progetto open source. – unforgettableid

+0

@ChrisStratton: ho fatto una ricerca su Google ma non ho trovato nessun thread più recente che menzioni la soluzione 'svc power shutdown'. Se esiste un tale thread in futuro, dovremmo contrassegnare questo thread antico come un duplicato di quel thread più recente. Peccato che Google sembra dare classifiche di risultati così alti ai thread di Overflow dello stack così antichi. Forse potremmo in qualche modo aggiungere un avviso di contenuto obsoleto in alto. O, meglio ancora, forse dovremmo semplicemente segnalare le domande obsolete come duplicati di domande identiche più nuove. – unforgettableid

risposta

0

Nel codice sorgente di Android, è possibile trovare il seguente:

/** 
* Low-level function turn the device off immediately, without trying 
* to be clean. Most people should use 
* {@link android.internal.app.ShutdownThread} for a clean shutdown. 
* 
* @deprecated 
* @hide 
*/ 
@Deprecated 
public static native void shutdown(); 

Penso che questa funzione nativa corrisponde alla tua su reboot -p. Inoltre, è possibile vedere dal commento del codice indicato che è necessario utilizzare ShutdownThread per eseguire un arresto pulito.

In ShutdownThread, Android fa un sacco di cose.

  • Arresta ActivityManager. Penso che l'arresto di ActivityManager significhi che tutte le attività supereranno il ciclo di vita necessario e, quindi, verranno memorizzati gli stati delle attività. Ma non sono sicuro. Non ho controllato
  • Quindi, Android disattiva l'interfaccia della radio cellulare.
  • Dopodiché, si spegne il Bluetooth.
  • Infine, tenta di arrestare MountService.

Quindi, è possibile vedere che è sbagliato fare su reboot -p.

+0

Non funziona. – michelemarcon

+0

Hai appena chiesto se il tuo approccio è giusto. Ti ho mostrato perché non è una buona pratica farlo. Non ti ho detto che il metodo 'shutdown()' funzionerà nel tuo caso. – Yury

+0

Ho accettato la risposta, tuttavia la mia domanda implicava "quale dovrebbe essere la migliore pratica per spegnere?", Ma nessuno è in grado di rispondere a questa domanda ... :( – michelemarcon

0

vedere qui: http://developer.android.com/reference/android/os/PowerManager.html

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
pm.reboot("Because I want you to reboot!") 

Questo dovrebbe funzionare.

+0

Mi dispiace, ho appena scoperto che funziona solo per le app che sono state firmate come "app di sistema" invece di app utente. (È possibile solo se si conosce la chiave con cui è stato firmato il firmware) – devsnd

+1

Ciò non funzionerà, in quanto nessuna applicazione di terze parti è autorizzata a farlo. –

0

Su Android 4.3 o versioni successive, c'è probabilmente un modo migliore per spegnere il dispositivo.

L'app non ha bisogno di essere installata come app di sistema, ma deve disporre dei privilegi di root. Si può semplicemente eseguire questo comando come root al fine di chiudere il dispositivo verso il basso:

svc power shutdown

Ringrazio Firelord la sua risposta elsewhere che mi ha spinto a scoprire l'esistenza di questo comando di shell.

Penso che questo eseguirà un arresto regolare, ma non ne sono sicuro. Forse farà un arresto improvviso. Per favore prova, e poi edit this answer per chiarire.

Inoltre, il comando di shell precedente non funziona in Android 4.2.2 o versioni precedenti. Lo help text non lo menziona. svc rifiuta il comando come non valido e mostra del testo di guida per cercare di essere utile.

1

Se la vostra applicazione è radicata, quindi eseguire il seguente come root:

am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN

Problemi correlati