转自:http://www.2cto.com/kf/201412/363630.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);                      }


更多相关文章

  1. Android的DialogFragment的基本使用方法
  2. [置顶] android IPC通信(下)-AIDL
  3. Android ListView的item点击无响应的解决方法
  4. android 网络通信(一)
  5. Android 的http通信(原生代码)
  6. Android的网络与通信
  7. Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implem

随机推荐

  1. 制作ota升级包之error:Could not create t
  2. Android(安卓)API 28 访问服务器失败 提
  3. android 中文 api (64) —— Scroller
  4. Android(安卓)加载.gif格式图片
  5. Android配置----Eclipse+BlueStacks调试A
  6. 关于Android(安卓)API,你所不知道的
  7. android dialog
  8. EditText 属性
  9. Android进入应用下载评分界面
  10. EditText属性解释