2012-03-07 25 views
7

在我的根用戶的Android應用程序,我執行關閉與Android的根關機

su reboot -p 

它的工作好,但我注意到,手機關機幾乎立即(從顯示關機動畫反對,可能做其他的事情)。

這是以編程方式關閉android手機的正確方法嗎?是否有一些關鍵代碼需要在關閉之前執行?

+0

@unforgettableid你的建議的修改既大錯特錯(應用程序不能以root身份運行,最多隻本地傭工),以及相對毫無意義,因爲這是一個4年前的低價值問題,不需要重新審視。 – 2016-06-06 00:21:51

+0

@ChrisStratton:謝謝你糾正我;我修改了我的修改建議。去年2月,GitHub評論者在[GitHub評論](https://github.com/ppareit/Shutdown/issues/4#issuecomment-188899438)中引用了此堆棧溢出線程。我同意GitHub評論者引用這樣一個古老的主題是愚蠢的。不過,他確實參考了它。由於答案如此之久,其他人浪費時間對開源項目做出不理想的承諾。 – unforgettableid 2016-06-06 00:54:34

+0

@ChrisStratton:我做了一次Google搜索,但沒有找到提到'svc power shutdown'解決方案的新線程。如果將來存在這樣的線索,我們應該將這個古老的線索標記爲該新線索的複製品。谷歌似乎給Stack Overflow這麼古老的線程提供如此高的搜索結果排名太糟糕了。也許我們可以在頂部添加一些陳舊內容警告。或者,更好的是,也許我們應該將過時的問題標記爲新的相同問題的重複。 – unforgettableid 2016-06-06 00:54:39

回答

0

在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關閉蜂窩無線電接口。
  • 之後,它關閉藍牙。
  • 最後,它試圖關閉MountService。

因此,您可以看到su reboot -p這是錯誤的。

+0

它不起作用。 – michelemarcon 2012-03-21 13:11:15

+0

你剛剛問過你的方法是否正確。我向你展示了爲什麼這樣做不是一個好習慣。我沒有告訴你'shutdown()'方法適用於你的情況。 – Yury 2012-03-21 14:27:53

+0

我已經接受了你的回答,但是我的問題暗示了「應該關機的最佳做法是什麼?」,但沒有人能夠回答這個問題...... :( – michelemarcon 2012-03-22 13:44:19

0

在這裏看到: http://developer.android.com/reference/android/os/PowerManager.html

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

這應該工作。

+0

對不起,我剛發現,它只適用於被簽名爲「系統應用程序」而不是用戶應用程序的應用程序。 (只有當您知道固件簽名的密鑰時纔有可能) – devsnd 2012-03-07 11:39:10

+1

這不起作用,因爲沒有第三方應用程序有權這樣做。 – 2016-06-06 00:20:46

0

在Android 4.3或更高版本上,可能有更好的方法來關閉設備。

您的應用程序不需要作爲系統應用程序安裝,但它必須具有root權限。你可以簡單地以關閉設備運行此命令一個以root身份:

svc power shutdown

我感謝炎魔他的回答elsewhere這啓發了我發現這個shell命令的存在。

我認爲這會做一個優雅的關機,但我不確定。也許它會做一個突然關機。請測試,然後edit this answer澄清。

此外,上述shell命令在Android 4.2.2或更低版本中不起作用。 help text沒有提到它。 svc拒絕將該命令視爲無效,並顯示一些幫助文本以嘗試提供幫助。

1

如果您的應用紮根,然後運行以下爲根:

am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN