Android root poweroff - PullRequest
       34

Android root poweroff

7 голосов
/ 07 марта 2012

В моем приложении для Android для пользователя root я выполняю выключение с помощью

su reboot -p

Все работает нормально, но я заметил, что телефон выключается почти мгновенно (в отличие от отображения анимации выключения и, возможно,делать другие вещи).

Это правильный способ программного отключения телефона Android?Есть ли какой-нибудь критический код, который необходимо выполнить перед выключением?

Ответы [ 4 ]

1 голос
/ 17 марта 2017

Если ваше приложение имеет root-права, запустите следующее от имени root:

am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN

0 голосов
/ 07 марта 2012

В исходном коде Android вы можете найти следующее:

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

Я думаю, что эта нативная функция соответствует вашей su reboot -p. Кроме того, из приведенного комментария к коду видно, что для выполнения чистого отключения следует использовать ShutdownThread.

В ShutdownThread, Android делает кучу вещей.

  • Отключает ActivityManager. Я думаю, что закрытие ActivityManager означает, что все действия пройдут необходимый жизненный цикл и, таким образом, будут сохранены состояния действий. Но я не уверен. Я не проверял.
  • Затем Android отключает интерфейс сотовой связи.
  • После этого Bluetooth отключается.
  • Наконец, он пытается отключить MountService.

Таким образом, вы можете видеть, что неправильно делать su reboot -p.

0 голосов
/ 06 июня 2016

В Android 4.3 или более поздней версии, возможно, есть лучший способ выключить устройство.

Ваше приложение не нужно устанавливать как системное приложение, но оно должно иметь привилегии root. Вы можете просто запустить эту команду от имени пользователя root, чтобы выключить устройство:

svc power shutdown

Я благодарю Повелителя Огня за его ответ в другом месте , который вдохновил меня на обнаружение существования этой команды оболочки.

Я думаю, что это изящно завершит работу, но я не уверен. Может быть, это сделает внезапное отключение. Пожалуйста, проверьте, а затем отредактируйте этот ответ , чтобы уточнить.

Кроме того, приведенная выше команда оболочки не работает в Android 4.2.2 или более ранней версии. текст справки не упоминает об этом. svc отклоняет команду как недействительную и отображает текст справки, чтобы попытаться помочь.

0 голосов
/ 07 марта 2012

См. Здесь: http://developer.android.com/reference/android/os/PowerManager.html

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

Это должно работать.

...