android 如何实现代码关机
开始从网上搜索,通过发action的方式实现,不过一直没有成功。
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SHUTDOWN);
sendBroadcast(intent);
加权限
<uses-permissionandroid:name="android.permission.SHUTDOWN" tools:ignore="ProtectedPermissions" />
若有成功的同学,希望留言相告,谢谢。
这里介绍我自己的方法。
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) {
        forceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
final long ident = Binder.clearCallingIdentity();
        try {
            shutdownOrRebootInternal(true, confirm, null, wait);
        } finally {
            storeCallingIdentity(ident);
        }
    }
2. PowerManager提供了reboot等接口,没有提供shutdown接口。
若是重启,实现就很简单:
PowerManager pm = (SystemService(Context.POWER_SERVICE);
pm.reboot();
但是shutdown没有实现,PowerManager的实现通过IPowerManager来调用Power服务的接口。
IPowerManagerAIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录framework/base/core/java/android/os/IPowerManage.aidl
3. IPowerManager实现了shutdown接口,这里只要获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。
ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder
ServiceManager这个类也是HIDE的,也需要反射进行调用。
代码实现:
[java] view plaincopyprint?
try {
         
          //获得ServiceManager 
          Class<?> ServiceManager = Class
            .forName("android.os.ServiceManager");
         
          //获得ServiceManagergetService方法 
          Method getService = Method("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 = Method("asInterface", android.os.IBinder.class);
          //调用asInterface方法获取IPowerManager对象 
          Object oIPowerManager = asInterface.invoke(null, oRemoteService);
          //获得shutdown()方法 
          Method shutdown = Class().getMethod("shutdown",boolean.class,boolean.class);
          //调用shutdown()方法 
          shutdown.invoke(oIPowerManager,false,true);           
   
} catch (Exception e) {         
    Log.e(TAG, e.toString(), e);       
}
try {
               
                //获得关机程序代码ServiceManager
                Class<?> ServiceManager = Class
                    .forName("android.os.ServiceManager");
               
                //获得ServiceManagergetService方法
                Method getService = Method("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 = Method("asInterface", android.os.IBinder.class);
                //调用asInterface方法获取IPowerManager对象
                Object oIPowerManager = asInterface.invoke(null, oRemoteService);
                //获得shutdown()方法
                Method shutdown = Class().getMethod("shutdown",boolean.class,boolean.class);
                //调用shutdown()方法
                shutdown.invoke(oIPowerManager,false,true);         
         
      } catch (Exception e) {       
            Log.e(TAG, e.toString(), e);     
      }
来源:清源教育

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。