android 关机实现 需要系统权限

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);        
       }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值