Android实现系统关机和重启
16lz
2022-05-07
Android实现系统关机和重启
一、将APP提升至系统权限
在AndroidMenifest.xml中添加如下代码:
二、 添加关机权限
三、由于需要在源码中编译项目,所以要为项目编写mk文件,在项目根目录下添加Android.mk文件,内容如下所示:
四、实现代码
4.1、关机代码
4.1.1 使用广播方式实现
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服务实现的关机功能。
4.2、 重启代码
4.2.1 使用广播方式实现
4.2.2 调用PowerManager的reboot方法实现
一、将APP提升至系统权限
在AndroidMenifest.xml中添加如下代码:
android:sharedUserId="android.uid.system"
二、 添加关机权限
注:经测试在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获取RemoteService Object 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(); } }
更多相关文章
- 使用Kotlin:让Android与JS交互的详解
- Android调用系统关机与重启功能
- AlertDialog实现普通对话框和登录对话框——Android
- Linux Kernel and Android(安卓)休眠与唤醒(中文版)
- 浅析 Android(安卓)的窗口
- Android中的横竖屏
- AndroidUI设计之 布局管理器 - 详细解析布局实现
- Android(安卓)-- AppWidget 高级篇
- 浅谈Java中Collections.sort对List排序的两种方法