当前位置:操作系统 > 安卓/Android >>

android 实现代码关机

开始从网上搜索,通过发action的方式实现,不过一直没有成功。
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_SHUTDOWN);
sendBroadcast(intent);
加权限
<uses-permission  android: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) {
        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的,也需要反射进行调用。


代码实现:
[java] view plaincopyprint?
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"); 
          //获得asInte易做图ce方法  
          Method asInte易做图ce = cStub.getMethod("asInte易做图ce", android.os.IBinder.class); 
          //调用asInte易做图ce方法获取IPowerManager对象  
          Object oIPowerManager = asInte易做图ce.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);         

       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");
                 //获得asInte易做图ce方法
                 Method asInte易做图ce = cStub.getMethod("asInte易做图ce", android.os.IBinder.class);
                 //调用asInte易做图ce方法获取IPowerManager对象
                 Object oIPowerManager = asInte易做图ce.invoke(null, oRemoteService);
              &

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,