Android实现关机与重启的几种方式
Android实现关机与重启的几种方式(推荐)
在Android系统上,关机与重启是比较常见的操作,本文将介绍几种实现关机与重启的方式,并推荐一种比较简洁的方法供大家参考。
1. 使用系统广播实现关机与重启
我们可以通过发送系统广播来实现关闭或重启设备的操作。具体实现方法如下:
关机操作
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");intent.putExtra("android.intent.extra.KEY_CONFIRM", false);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);重启操作
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);pm.reboot("");通过这种方式,我们可以实现基本的关机与重启操作。但是,该方法需要添加权限并且需要用户手动确认,相对来说不够优雅。
2. 使用root权限实现关机与重启
如果我们的设备已经获取了root权限,我们还可以通过执行shell命令来实现关机与重启操作。具体实现方法如下:
关机操作
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot -p" });proc.waitFor();重启操作
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });proc.waitFor();该方法需要设备已经获取了root权限,否则无法执行。当然,获取root权限也并不是一件简单的事情,需要有一定的技术要求。因此该方法不适用于一般用户。
3. 推荐:使用Java反射实现关机与重启
另外,还有一种比较优雅的方式,就是使用Java反射来实现关闭或重启设备的操作。具体实现方法如下:
try { Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager"); Method getServiceMethod = serviceManagerClass.getMethod("getService", String.class); IBinder binder = (IBinder) getServiceMethod.invoke(null, "power"); Class<?> iPowerManagerClass = Class.forName("android.os.IPowerManager"); Object iPowerManager = iPowerManagerClass.cast(binder); Method shutdownMethod = iPowerManager.getClass().getMethod("shutdown", boolean.class, String.class, boolean.class); shutdownMethod.invoke(iPowerManager, true, "", false);} catch (Exception e) { e.printStackTrace();}try { Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager"); Method getServiceMethod = serviceManagerClass.getMethod("getService", String.class); IBinder binder = (IBinder) getServiceMethod.invoke(null, "power"); Class<?> iPowerManagerClass = Class.forName("android.os.IPowerManager"); Object iPowerManager = iPowerManagerClass.cast(binder); Method rebootMethod = iPowerManager.getClass().getMethod("reboot", boolean.class, String.class, boolean.class); rebootMethod.invoke(iPowerManager, true, "", false);} catch (Exception e) { e.printStackTrace();}该方法使用Java反射的方式,无需添加权限,相对来说比较简洁优雅。