zoukankan      html  css  js  c++  java
  • android 实现代码关机

    开始从网上搜索,通过发action的方式实现,不过一直没有成功。
    Intent intent = new Intent();  
    intent.setAction(Intent.ACTION_SHUTDOWN);
    sendBroadcast(intent);
    加权限
    <uses-permission  android:name="android.permission.SHUTDOWN" tools:ignore="ProtectedPermissions" />

    若有成功的同学,希望留言相告,谢谢。

    这里介绍我自己的方法。

    1. power服务实现了关机功能
    framework/base/services/java/com/android/server/power/PowerManagerService.java
       
        /**
         * Shuts down the device.
         *
         * @param confirm If true, shows a shutdown confirmation dialog.
         * @param wait If true, this call waits for the shutdown to complete and does not return.
         */
        @Override // Binder call
        public void shutdown(boolean confirm, boolean wait) {
            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);

            final long ident = Binder.clearCallingIdentity();
            try {
                shutdownOrRebootInternal(true, confirm, null, wait);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
        }


    2. PowerManager提供了reboot等接口,没有提供shutdown接口。
    若是重启,实现就很简单:
       PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
       pm.reboot();
    但是shutdown没有实现,PowerManager的实现通过IPowerManager来调用Power服务的接口。
    IPowerManager是AIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录framework/base/core/java/android/os/IPowerManage.aidl

    3. IPowerManager实现了shutdown接口,这里只要获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。
    ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder。
    而ServiceManager这个类也是HIDE的,也需要反射进行调用。


    代码实现:

           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(TAG, e.toString(), e);        
           }



  • 相关阅读:
    mysql group_concat函数
    easyui textbox获取焦点事件
    jquery获取select下拉框的前一个,后一个,第一个,最后一个option对象
    easyui 只刷新当前页面的数据 datagrid reload 方法
    spring-data-jpa查询语句的书写实例小计
    jquery给input标签添加data-options属性
    正则表达式的常用方法
    正则表达式之 /^(d)$/
    jquery获取下拉列表的值和显示内容的方法
    一个 关于 case when的SQL
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3141014.html
Copyright © 2011-2022 走看看