2012-03-07 29 views
7

En mi aplicación Android para el usuario root, que realiza un cierre conAndroid de apagado raíz

su reboot -p 

Funciona bien, pero me di cuenta de que el teléfono está apagado casi al instante (a diferencia de mostrar la animación de apagado, y probablemente haciendo otras cosas).

¿Es esta la forma correcta de apagar un teléfono Android programáticamente? ¿Hay algún código crítico que requiera ser ejecutado antes del cierre?

+0

@unforgettableid su modificación propuesta es a la vez seriamente erróneas (aplicaciones no se pueden ejecutar como root, sólo en la mayoría de los ayudantes nativos), y relativamente inútil ya que esta es una pregunta de 4 años de bajo valor que no necesita ser revisada. –

+0

@ChrisStratton: Gracias por corregirme; Revisé mi sugerencia de edición. Un comentarista de GitHub acaba de hacer referencia a este hilo de desbordamiento de pila en un [comentario de GitHub] (https://github.com/ppareit/Shutdown/issues/4#issuecomment-188899438) en febrero pasado. Estoy de acuerdo en que fue una tontería para el comentarista de GitHub hacer referencia a un hilo tan antiguo. Aún así, él lo hizo referencia. Debido a que las respuestas eran tan antiguas, alguien más perdió su tiempo haciendo un compromiso subóptimo a un proyecto de código abierto. – unforgettableid

+0

@ChrisStratton: Hice una búsqueda en Google pero no encontré ningún hilo más reciente que mencione la solución 'svc power shutdown'. Si existe tal hilo que existe en el futuro, debemos marcar este antiguo hilo como un duplicado de ese hilo más nuevo. Es una lástima que Google parezca otorgar clasificaciones de resultados de búsqueda tan altas a los hilos de Stack Overflow tan antiguos. Quizás de alguna manera podríamos agregar alguna advertencia de contenido rancio en la parte superior. O, mejor aún, tal vez deberíamos simplemente marcar preguntas desactualizadas como duplicados de preguntas idénticas más nuevas. – unforgettableid

Respuesta

0

En el código fuente de Android, se puede encontrar la siguiente:

/** 
* 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(); 

creo que esta función nativa corresponde a su su reboot -p. Además, puede ver en el comentario del código citado que debe usar ShutdownThread para hacer un apagado limpio.

En ShutdownThread, Android hace un montón de cosas.

  • Apaga el ActivityManager. Creo que al cerrar ActivityManager significa que todas las actividades pasarán el ciclo de vida necesario y, por lo tanto, se almacenarán los estados de las actividades. Pero no estoy seguro. No revisé.
  • Luego, Android apaga la interfaz de la radio celular.
  • Después de eso, apaga el Bluetooth.
  • Finalmente, intenta cerrar MountService.

Por lo tanto, puede ver que es incorrecto hacer su reboot -p.

+0

No funciona. – michelemarcon

+0

Usted acaba de preguntar si su enfoque es el correcto. Te mostré por qué no es una buena práctica hacerlo. No te dije que el método 'shutdown()' funcionará en tu caso. – Yury

+0

He aceptado su respuesta, sin embargo, mi pregunta implicó "¿cuál debería ser la mejor práctica para cerrar?", Pero nadie puede responder esa pregunta ... :( – michelemarcon

0

Ver aquí: http://developer.android.com/reference/android/os/PowerManager.html

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

Esto debería funcionar.

+0

Lo siento, me acabo de enterar, que solo funciona para aplicaciones que están firmadas como "aplicaciones de sistema" en lugar de aplicaciones de usuario. (Solo es posible si conoce la clave con la que se firmó el firmware) – devsnd

+1

Esto no funcionará, ya que ninguna aplicación de terceros tiene autoridad para hacerlo. –

0

En Android 4.3 o posterior, es probable que haya una forma mejor de apagar el dispositivo.

Su aplicación no necesita instalarse como una aplicación del sistema, pero debe tener privilegios de administrador. Simplemente puede ejecutar este comando como root con el fin de cerrar el dispositivo hacia abajo:

svc power shutdown

Doy gracias Señor del Fuego por su respuesta elsewhere que me inspiró para descubrir la existencia de este comando shell.

Creo que esto hará un cierre elegante, pero no estoy seguro. Tal vez hará un cierre abrupto. Por favor, prueba, y luego edit this answer para aclarar.

Además, el comando de shell anterior no funciona en Android 4.2.2 o versiones anteriores. El help text no lo menciona. svc rechaza el comando como no válido y muestra texto de ayuda para tratar de ser útil.

1

Si se arraiga su aplicación, a continuación, ejecute lo siguiente como root:

am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN

Cuestiones relacionadas