android adb 关机实现方式


   笔者遇到需要控制android emulator关机的问题,主要有以下几种方法实现:

第一种:

    Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
    intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

     这里需要注意的一点是,需要将frameworks.jar导入到eclipse工程,否则没有Intent.ACTION_REQUEST_SHUTDOWN这一项   

    frameworks.jar在源码目录地址为./out/target/product/generic/system/framework

第二种:

      public void shutdown() {
        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 (Exception e) {
            Log.e("SystemStatusSetting", e.toString(), e);
        }
    }

      该方法是利用了反射机制调用PowerManagerService shutdown,PowerManager类没有提供关机的接口,而是通过IBinder与PowerManagerService 类进行通信。PowerManagerService调用Power 类来与下一层进行通信. PowerManagerService实现了shutdown接口,power服务实现了关机功能。 IPowerManager是AIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录framework/base/core/java/android/os/IPowerManage.aidl
IPowerManager实现了shutdown接口,所以,如果我们能够获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能PowerManager提供了reboot接口可以直接调用PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE);  //重启到fastboot模式                pManager.reboot("");

第三种:

        通过adb shell 登录后,发现system/bin 下面只有reboot命令,没有shutdown命令。经过研究发现可以通过reboot -p命令来实现关机,于是

        try{
                    Process process =Runtime.getRuntime().exec(new String[]{"su","-c","reboot -p"});  //关机
                    proc.waitFor();
                }catch(Exception e){
                    e.printStackTrace();
                }

      使用该方法需要注意的是,使用的Android设备必须已经root过

你可能感兴趣的:(Android)