Android实现系统关机和重启

一、将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();        }    }




更多相关文章

  1. 使用Kotlin:让Android与JS交互的详解
  2. Android调用系统关机与重启功能
  3. AlertDialog实现普通对话框和登录对话框——Android
  4. Linux Kernel and Android(安卓)休眠与唤醒(中文版)
  5. 浅析 Android(安卓)的窗口
  6. Android中的横竖屏
  7. AndroidUI设计之 布局管理器 - 详细解析布局实现
  8. Android(安卓)-- AppWidget 高级篇
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android(安卓)中的单元测试(使用AndroidT
  2. Android深入浅出系列课程---Lesson9 AAF1
  3. Android应用开发试题(收集)
  4. 安卓开发38:安卓的滚动条相关属性
  5. Android下打印调用栈
  6. android 软键盘 返回键 消失事件 监听
  7. Android开发6:日志信息输出
  8. Android获取设备唯一标识
  9. android 事件处理
  10. WebKit – WebKit For Android