Android

个人Android学习总结


关机 -- 通过反射机制

<pre><code> PowerManager reboot以及反射调用PowerManagerService shutdown 1. PowerManager提供了reboot等接口,因此,利用PowerManager实现重启,就比较简单。 [html] view plain copy 在CODE上查看代码片派生到我的代码片 PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE); pManager.reboot(null); &amp;lt;span style=&amp;quot;font-family: Arial, Helvetica, sans-serif;&amp;quot;&amp;gt;//重启&amp;lt;/span&amp;gt; 2. PowerManager类并没有提供关机的shutdown接口,而是通过IBinder这种Android中特有的通信模式,与PowerManagerService 类进行通信。PowerManagerService是PowerManager 类中定义的接口的具体实现,并进一步调用Power 类来与下一层进行通信. 在PowerManagerService实现了shutdown接口,power服务实现了关机功能 PowerManager的实现通过IPowerManager来调用Power服务的接口。 IPowerManager是AIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录 [html] view plain copy 在CODE上查看代码片派生到我的代码片 framework/base/core/java/android/os/IPowerManage.aidl IPowerManager实现了shutdown接口,所以,如果我们能够获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。 需要注意的是,ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder。 但ServiceManager这个类也是HIDE的,也需要反射进行调用。两次,通过两次反射调用,就能调用power服务实现的关机功能。</code></pre> <pre><code class="language-java"> /** * 关机 * * @return void */ public static void powerOff() { try { // 获得ServiceManager类 Class&amp;lt;?&amp;gt; ServiceManager = Class .forName(&amp;quot;android.os.ServiceManager&amp;quot;); // 获得ServiceManager的getService方法 Method getService = ServiceManager.getMethod(&amp;quot;getService&amp;quot;, java.lang.String.class); // 调用getService获取RemoteService Object oRemoteService = getService.invoke(null, Context.POWER_SERVICE); // 获得IPowerManager.Stub类 Class&amp;lt;?&amp;gt; cStub = Class.forName(&amp;quot;android.os.IPowerManager$Stub&amp;quot;); // 获得asInterface方法 Method asInterface = cStub.getMethod(&amp;quot;asInterface&amp;quot;, android.os.IBinder.class); // 调用asInterface方法获取IPowerManager对象 Object oIPowerManager = asInterface.invoke(null, oRemoteService); // 获得shutdown()方法 Method shutdown = oIPowerManager.getClass().getMethod(&amp;quot;shutdown&amp;quot;, boolean.class, boolean.class); // 调用shutdown()方法 shutdown.invoke(oIPowerManager, false, true); } catch (Exception e) { e.printStackTrace(); } }</code></pre>

页面列表

ITEM_HTML