當(dāng)前位置:
首頁(yè) >
Android实现系统关机和重启
發(fā)布時(shí)間:2025/7/25
46
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Android实现系统关机和重启
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android實(shí)現(xiàn)系統(tǒng)關(guān)機(jī)和重啟
一、將APP提升至系統(tǒng)權(quán)限
在AndroidMenifest.xml中添加如下代碼: android:sharedUserId="android.uid.system"
二、 添加關(guān)機(jī)權(quán)限 <uses-permission android:name="android.permission.SHUTDOWN" />注:經(jīng)測(cè)試在AndroidMenifest.xml添加了該權(quán)限會(huì)有警告,而且不添加也可以實(shí)現(xiàn)關(guān)機(jī),所以具體以運(yùn)行的實(shí)際效果為主。
三、由于需要在源碼中編譯項(xiàng)目,所以要為項(xiàng)目編寫mk文件,在項(xiàng)目根目錄下添加Android.mk文件,內(nèi)容如下所示: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := PowerActionDemo LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE)
四、實(shí)現(xiàn)代碼
4.1、關(guān)機(jī)代碼
4.1.1 使用廣播方式實(shí)現(xiàn) /*** 關(guān)機(jī)** @param v*/public void shutDown(View v) {try {// 源碼中"android.intent.action.ACTION_REQUEST_SHUTDOWN“ 就是 Intent.ACTION_REQUEST_SHUTDOWN方法Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");// 源碼中"android.intent.extra.KEY_CONFIRM"就是 Intent.EXTRA_KEY_CONFIRM方法,// 其中false換成true,會(huì)彈出是否關(guān)機(jī)的確認(rèn)窗口intent.putExtra("android.intent.extra.KEY_CONFIRM", true);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} catch (Exception e) {e.printStackTrace();}}注: 代碼中的“android.intent.action.ACTION_REQUEST_SHUTDOWN”就是Intent.ACTION_REQUEST_SHUTDOWN; “android.inttent.extra.KEY_CONFIRM”就是Intent.EXTRA_KEY_CONFIRM. 由于在兩個(gè)屬性不對(duì)上層開放,所以就沒有調(diào)用,直接寫出來了;
4.1.2 通過反射調(diào)用實(shí)現(xiàn) ①、PowerManager類并沒有提供關(guān)機(jī)的shutdown接口,而是通過IBinder這種Android中特有的通信模式,與PowerManagerService 類進(jìn)行通信。PowerManagerService是PowerManager 類中定義的接口的具體實(shí)現(xiàn),并進(jìn)一步調(diào)用Power 類來與下一層進(jìn)行通信. 在PowerManagerService實(shí)現(xiàn)了shutdown接口,power服務(wù)實(shí)現(xiàn)了關(guān)機(jī)功能。
②、PowerManager的實(shí)現(xiàn)通過IPowerManager來調(diào)用Power服務(wù)的接口。 IPowerManager是AIDL文件自動(dòng)生成的類,便于遠(yuǎn)程通信。 ③、IPowerManage.aidl文件目錄“framework/base/core/java/android/os/IPowerManage.aidl” ④、IPowerManager實(shí)現(xiàn)了shutdown接口,所以,如果我們能夠獲得Power服務(wù)的IBinder,通過反射調(diào)用shutdown方法就能實(shí)現(xiàn)關(guān)機(jī)功能。?
需要注意的是,ServiceManager管理著系統(tǒng)的服務(wù)程序,它保存著所有服務(wù)的IBinder,通過服務(wù)名就能獲取到這個(gè)服務(wù)的IBinder。?
但ServiceManager這個(gè)類也是HIDE的,也需要反射進(jìn)行調(diào)用。兩次,通過兩次反射調(diào)用,就能調(diào)用power服務(wù)實(shí)現(xiàn)的關(guān)機(jī)功能。 /*** 關(guān)機(jī)* @param view*/public void shutDown(View view) {try {//獲得ServiceManager類Class<?> ServiceManager = Class.forName("android.os.ServiceManager");//獲得ServiceManager的getService方法Method getService = ServiceManager.getMethod("getService", java.lang.String.class);//調(diào)用getService獲取RemoteServiceObject oRemoteService = getService.invoke(null, Context.POWER_SERVICE);//獲得IPowerManager.Stub類Class<?> cStub = Class.forName("android.os.IPowerManager$Stub");//獲得asInterface方法Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);//調(diào)用asInterface方法獲取IPowerManager對(duì)象Object oIPowerManager = asInterface.invoke(null, oRemoteService);//獲得shutdown()方法Method shutdown = oIPowerManager.getClass().getMethod("shutdown", boolean.class, boolean.class);//調(diào)用shutdown()方法shutdown.invoke(oIPowerManager, false, true);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
4.2、 重啟代碼
4.2.1 使用廣播方式實(shí)現(xiàn)
/*** 重啟** @param v*/public void reBoot(View v) {try {Intent intent2 = new Intent(Intent.ACTION_REBOOT);intent2.putExtra("nowait", 1);intent2.putExtra("interval", 1);intent2.putExtra("window", 0);sendBroadcast(intent2);} catch (Exception e) {e.printStackTrace();}}
4.2.2 調(diào)用PowerManager的reboot方法實(shí)現(xiàn)
/*** 重啟* @param view*/public void reBoot(View view) {try {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot("");} catch (Exception e) {e.printStackTrace();}}
一、將APP提升至系統(tǒng)權(quán)限
在AndroidMenifest.xml中添加如下代碼: android:sharedUserId="android.uid.system"
二、 添加關(guān)機(jī)權(quán)限 <uses-permission android:name="android.permission.SHUTDOWN" />注:經(jīng)測(cè)試在AndroidMenifest.xml添加了該權(quán)限會(huì)有警告,而且不添加也可以實(shí)現(xiàn)關(guān)機(jī),所以具體以運(yùn)行的實(shí)際效果為主。
三、由于需要在源碼中編譯項(xiàng)目,所以要為項(xiàng)目編寫mk文件,在項(xiàng)目根目錄下添加Android.mk文件,內(nèi)容如下所示: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := PowerActionDemo LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE)
四、實(shí)現(xiàn)代碼
4.1、關(guān)機(jī)代碼
4.1.1 使用廣播方式實(shí)現(xiàn) /*** 關(guān)機(jī)** @param v*/public void shutDown(View v) {try {// 源碼中"android.intent.action.ACTION_REQUEST_SHUTDOWN“ 就是 Intent.ACTION_REQUEST_SHUTDOWN方法Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");// 源碼中"android.intent.extra.KEY_CONFIRM"就是 Intent.EXTRA_KEY_CONFIRM方法,// 其中false換成true,會(huì)彈出是否關(guān)機(jī)的確認(rèn)窗口intent.putExtra("android.intent.extra.KEY_CONFIRM", true);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} catch (Exception e) {e.printStackTrace();}}注: 代碼中的“android.intent.action.ACTION_REQUEST_SHUTDOWN”就是Intent.ACTION_REQUEST_SHUTDOWN; “android.inttent.extra.KEY_CONFIRM”就是Intent.EXTRA_KEY_CONFIRM. 由于在兩個(gè)屬性不對(duì)上層開放,所以就沒有調(diào)用,直接寫出來了;
4.1.2 通過反射調(diào)用實(shí)現(xiàn) ①、PowerManager類并沒有提供關(guān)機(jī)的shutdown接口,而是通過IBinder這種Android中特有的通信模式,與PowerManagerService 類進(jìn)行通信。PowerManagerService是PowerManager 類中定義的接口的具體實(shí)現(xiàn),并進(jìn)一步調(diào)用Power 類來與下一層進(jìn)行通信. 在PowerManagerService實(shí)現(xiàn)了shutdown接口,power服務(wù)實(shí)現(xiàn)了關(guān)機(jī)功能。
②、PowerManager的實(shí)現(xiàn)通過IPowerManager來調(diào)用Power服務(wù)的接口。 IPowerManager是AIDL文件自動(dòng)生成的類,便于遠(yuǎn)程通信。 ③、IPowerManage.aidl文件目錄“framework/base/core/java/android/os/IPowerManage.aidl” ④、IPowerManager實(shí)現(xiàn)了shutdown接口,所以,如果我們能夠獲得Power服務(wù)的IBinder,通過反射調(diào)用shutdown方法就能實(shí)現(xiàn)關(guān)機(jī)功能。?
需要注意的是,ServiceManager管理著系統(tǒng)的服務(wù)程序,它保存著所有服務(wù)的IBinder,通過服務(wù)名就能獲取到這個(gè)服務(wù)的IBinder。?
但ServiceManager這個(gè)類也是HIDE的,也需要反射進(jìn)行調(diào)用。兩次,通過兩次反射調(diào)用,就能調(diào)用power服務(wù)實(shí)現(xiàn)的關(guān)機(jī)功能。 /*** 關(guān)機(jī)* @param view*/public void shutDown(View view) {try {//獲得ServiceManager類Class<?> ServiceManager = Class.forName("android.os.ServiceManager");//獲得ServiceManager的getService方法Method getService = ServiceManager.getMethod("getService", java.lang.String.class);//調(diào)用getService獲取RemoteServiceObject oRemoteService = getService.invoke(null, Context.POWER_SERVICE);//獲得IPowerManager.Stub類Class<?> cStub = Class.forName("android.os.IPowerManager$Stub");//獲得asInterface方法Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);//調(diào)用asInterface方法獲取IPowerManager對(duì)象Object oIPowerManager = asInterface.invoke(null, oRemoteService);//獲得shutdown()方法Method shutdown = oIPowerManager.getClass().getMethod("shutdown", boolean.class, boolean.class);//調(diào)用shutdown()方法shutdown.invoke(oIPowerManager, false, true);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
4.2、 重啟代碼
4.2.1 使用廣播方式實(shí)現(xiàn)
/*** 重啟** @param v*/public void reBoot(View v) {try {Intent intent2 = new Intent(Intent.ACTION_REBOOT);intent2.putExtra("nowait", 1);intent2.putExtra("interval", 1);intent2.putExtra("window", 0);sendBroadcast(intent2);} catch (Exception e) {e.printStackTrace();}}
4.2.2 調(diào)用PowerManager的reboot方法實(shí)現(xiàn)
/*** 重啟* @param view*/public void reBoot(View view) {try {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot("");} catch (Exception e) {e.printStackTrace();}}
總結(jié)
以上是生活随笔為你收集整理的Android实现系统关机和重启的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android安全开发之安全使用HTTP
- 下一篇: 在一个空的Eclipse中安装Andro