android反射调用 .

http://www.2cto.com/kf/201412/363630.html

 

http://www.android100.org/html/201502/14/118802.html

 

 

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服务实现的关机功能。

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);        
              }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值