您的位置:首页 > 移动开发 > Android开发

android 关机实现 需要系统权限

2016-11-29 17:31 465 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: