开始从网上搜索,通过发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的,也需要反射进行调用。


代码实现:

       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. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)Device Monitor工具的使用
  5. Android7 增加双以太网eth1的支持
  6. android 上下文菜单详解
  7. Android和H5混合开发(一)
  8. Android调用系统分享
  9. [置顶] Android(安卓)Studio Eclipse运行时出现 finished with n

随机推荐

  1. Android(安卓)颜色Color
  2. Androidの发送Email
  3. Android录音时,根据PCM数据获取音量值(单位
  4. Android引路蜂地图开发示例:第一个地图应
  5. android改变全局字体大小
  6. Androd之在图片右上角显示红色圆圈里面数
  7. [Android]Android(安卓)Studio导入第三方
  8. Android应用开发提高系列(5)——Android动
  9. Android学习之菜单
  10. android 发送邮件