Android实现系统关机和重启
生活随笔
收集整理的這篇文章主要介紹了
Android实现系统关机和重启
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android實現系統關機和重啟
一、將APP提升至系統權限
在AndroidMenifest.xml中添加如下代碼: android:sharedUserId="android.uid.system"
二、 添加關機權限 <uses-permission android:name="android.permission.SHUTDOWN" />注:經測試在AndroidMenifest.xml添加了該權限會有警告,而且不添加也可以實現關機,所以具體以運行的實際效果為主。
三、由于需要在源碼中編譯項目,所以要為項目編寫mk文件,在項目根目錄下添加Android.mk文件,內容如下所示: 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)
四、實現代碼
4.1、關機代碼
4.1.1 使用廣播方式實現 /*** 關機** @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,會彈出是否關機的確認窗口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. 由于在兩個屬性不對上層開放,所以就沒有調用,直接寫出來了;
4.1.2 通過反射調用實現 ①、PowerManager類并沒有提供關機的shutdown接口,而是通過IBinder這種Android中特有的通信模式,與PowerManagerService 類進行通信。PowerManagerService是PowerManager 類中定義的接口的具體實現,并進一步調用Power 類來與下一層進行通信. 在PowerManagerService實現了shutdown接口,power服務實現了關機功能。
②、PowerManager的實現通過IPowerManager來調用Power服務的接口。 IPowerManager是AIDL文件自動生成的類,便于遠程通信。 ③、IPowerManage.aidl文件目錄“framework/base/core/java/android/os/IPowerManage.aidl” ④、IPowerManager實現了shutdown接口,所以,如果我們能夠獲得Power服務的IBinder,通過反射調用shutdown方法就能實現關機功能。?
需要注意的是,ServiceManager管理著系統的服務程序,它保存著所有服務的IBinder,通過服務名就能獲取到這個服務的IBinder。?
但ServiceManager這個類也是HIDE的,也需要反射進行調用。兩次,通過兩次反射調用,就能調用power服務實現的關機功能。 /*** 關機* @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);//調用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);//調用asInterface方法獲取IPowerManager對象Object oIPowerManager = asInterface.invoke(null, oRemoteService);//獲得shutdown()方法Method shutdown = oIPowerManager.getClass().getMethod("shutdown", boolean.class, boolean.class);//調用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 使用廣播方式實現
/*** 重啟** @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 調用PowerManager的reboot方法實現
/*** 重啟* @param view*/public void reBoot(View view) {try {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot("");} catch (Exception e) {e.printStackTrace();}}
一、將APP提升至系統權限
在AndroidMenifest.xml中添加如下代碼: android:sharedUserId="android.uid.system"
二、 添加關機權限 <uses-permission android:name="android.permission.SHUTDOWN" />注:經測試在AndroidMenifest.xml添加了該權限會有警告,而且不添加也可以實現關機,所以具體以運行的實際效果為主。
三、由于需要在源碼中編譯項目,所以要為項目編寫mk文件,在項目根目錄下添加Android.mk文件,內容如下所示: 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)
四、實現代碼
4.1、關機代碼
4.1.1 使用廣播方式實現 /*** 關機** @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,會彈出是否關機的確認窗口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. 由于在兩個屬性不對上層開放,所以就沒有調用,直接寫出來了;
4.1.2 通過反射調用實現 ①、PowerManager類并沒有提供關機的shutdown接口,而是通過IBinder這種Android中特有的通信模式,與PowerManagerService 類進行通信。PowerManagerService是PowerManager 類中定義的接口的具體實現,并進一步調用Power 類來與下一層進行通信. 在PowerManagerService實現了shutdown接口,power服務實現了關機功能。
②、PowerManager的實現通過IPowerManager來調用Power服務的接口。 IPowerManager是AIDL文件自動生成的類,便于遠程通信。 ③、IPowerManage.aidl文件目錄“framework/base/core/java/android/os/IPowerManage.aidl” ④、IPowerManager實現了shutdown接口,所以,如果我們能夠獲得Power服務的IBinder,通過反射調用shutdown方法就能實現關機功能。?
需要注意的是,ServiceManager管理著系統的服務程序,它保存著所有服務的IBinder,通過服務名就能獲取到這個服務的IBinder。?
但ServiceManager這個類也是HIDE的,也需要反射進行調用。兩次,通過兩次反射調用,就能調用power服務實現的關機功能。 /*** 關機* @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);//調用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);//調用asInterface方法獲取IPowerManager對象Object oIPowerManager = asInterface.invoke(null, oRemoteService);//獲得shutdown()方法Method shutdown = oIPowerManager.getClass().getMethod("shutdown", boolean.class, boolean.class);//調用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 使用廣播方式實現
/*** 重啟** @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 調用PowerManager的reboot方法實現
/*** 重啟* @param view*/public void reBoot(View view) {try {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot("");} catch (Exception e) {e.printStackTrace();}}
總結
以上是生活随笔為你收集整理的Android实现系统关机和重启的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android安全开发之安全使用HTTP
- 下一篇: 常用的ADB命令