笔者遇到需要控制android emulator关机的问题,主要有以下几种方法实现:
第一种:
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
(Intent.EXTRA_KEY_CONFIRM, false);
(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这里需要注意的一点是,需要将导入到eclipse工程,否则没有Intent.ACTION_REQUEST_SHUTDOWN这一项
在源码目录地址为./out/target/product/generic/system/framework
第二种:
public void shutdown() {
try {
// 获得ServiceManager类
Class> ServiceManager = Class
.forName("");
// 获得ServiceManager的getService方法
Method getService = ("getService",
);
// 调用getService获取RemoteService
Object oRemoteService = (null,
Context.POWER_SERVICE);
// 获得类
Class> cStub = ("$Stub");
// 获得asInterface方法
Method asInterface = ("asInterface",
);
// 调用asInterface方法获取IPowerManager对象
Object oIPowerManager = (null, oRemoteService);
// 获得shutdown()方法
Method shutdown = ().getMethod("shutdown",
, );
// 调用shutdown()方法
(oIPowerManager, false, true);
} catch (Exception e) {
("SystemStatusSetting", (), e);
}
}
该方法是利用了反射机制调用PowerManagerService shutdown,PowerManager类没有提供关机的接口,而是通过IBinder与PowerManagerService 类进行通信。PowerManagerService调用Power 类来与下一层进行通信. PowerManagerService实现了shutdown接口,power服务实现了关机功能。 IPowerManager是AIDL文件自动生成的类,便于远程通信。文件目录framework/base/core/java/android/os/
IPowerManager实现了shutdown接口,所以,如果我们能够获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能PowerManager提供了reboot接口可以直接调用PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE); //重启到fastboot模式 ("");
第三种:
通过adb shell 登录后,发现system/bin 下面只有reboot命令,没有shutdown命令。经过研究发现可以通过reboot -p命令来实现关机,于是
try{
Process process =().exec(new String[]{"su","-c","reboot -p"}); //关机
();
}catch(Exception e){
();
}
使用该方法需要注意的是,使用的Android设备必须已经root过