Android系統關機或重啟的幾種實現方式
預設的SDK並沒有提供應用開發者直接的Android系統關機或重啟的API介面,一般來講,實現Android系統的關機或重啟,需要較高的許可權(系統許可權甚至Root許可權)。所以,在一般的APP中,如果想要實現關機或重啟功能,要麼是在App中宣告系統許可權,要麼是通過某種“間接”的方式,比如廣播或反射,來間接實現系統關機或重啟。再者,就是放在原始碼環境中進行編譯,這樣做有一個好處,就是可以直接呼叫Android中不公開的API,這是Eclipse+SDK沒法達到的效果。下面是我自己嘗試的幾種方式:
一. 傳送廣播方式
Broadcast是Android的四大基本元件之一,也就是我們常說的廣播。Android系統本身就包含了許多廣播,時時刻刻在監聽著系統中註冊的每一個廣播並隨時準備響應操作。其中,就有關於關機或重啟的廣播:Intent.ACTION_REQUEST_SHUTDOWN和Intent.ACTION_REBOOT,通過傳送這兩個廣播,Android就能自動接收廣播,並響應關機或重啟的操作。ACTION_REQUEST和ACTION_REBOOT是Intent.java是宣告的兩個字串常量
1 2 3 |
public
static
final
String ACTION_REBOOT =
"android.intent.action.REBOOT" ;
public
static
final
String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN" ;
|
Intent.java位於原始碼/frameworks/base/core/java/android/content/Intent.java下面。具體實現方法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//廣播方式關機重啟
case
R.id.shutdown_btn1:
Log.v(TAG,
"broadcast->shutdown" );
Intent
intent = new
Intent(Intent.ACTION_REQUEST_SHUTDOWN);
intent.putExtra(Intent.EXTRA_KEY_CONFIRM,
false );
//其中false換成true,會彈出是否關機的確認視窗
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
break ;
case
R.id.reboot_btn1:
Log.v(TAG,
"broadcast->reboot" );
Intent
intent2 = new
Intent(Intent.ACTION_REBOOT);
intent2.putExtra( "nowait" ,
1 );
intent2.putExtra( "interval" ,
1 );
intent2.putExtra( "window" ,
|