设为首页 加入收藏

TOP

Android系统关机或重启的实现方法(二)
2015-07-16 12:56:44 来源: 作者: 【 】 浏览:32
Tags:Android 系统 关机 重启 实现 方法
.../system/bin下面是不是包含system_shutdown.sh, system_reboot.sh两个sh文件,如果有,则说明编译成功。


5.最后,启动系统服务,进行关机或重启。


//启动系统服务进行关机或重启
? ?case R.id.shutdown_btn2:
? ? Log.v(TAG, "system service->shutdown");
? ? SystemProperties.set("ctl.start", "system_shutdwon");
? ? break;
? ?case R.id.reboot_btn2:
? ? Log.v(TAG, "system service->reboot");
? ? SystemProperties.set("ctl.start", "system_reboot");
? ? break;


三. Runtime调用Linux-shell


我们知道,Runtime这个Java类是可以用来调用并执行shell命令的,而Android虚拟机是支持Linux-shell语言的,基于这一点,可以利用Runtime来执行 关机或重启的shell命令,这一点和上面介绍的方式二原理上大致相同。功能代码如下:


//Runtime执行linux-shell
? ?case R.id.shutdown_btn3:
? ? try{
? ? ?Log.v(TAG, "root Runtime->shutdown");
? ? ?//Process proc =Runtime.getRuntime().exec(new String[]{"su","-c","shutdown"});? //关机
? ? ?Process proc =Runtime.getRuntime().exec(new String[]{"su","-c","reboot -p"});? //关机
? ? ? ? proc.waitFor();
? ? }catch(Exception e){
? ? ? ? e.printStackTrace();
? ? }
? ? break;
? ?case R.id.reboot_btn3:
? ? try {
? ? ?Log.v(TAG, "root Runtime->reboot");
? ? ?Process proc =Runtime.getRuntime().exec(new String[]{"su","-c","reboot "});? //关机
? ? ? ? proc.waitFor();
? ? }catch (Exception ex){
? ? ?ex.printStackTrace();
? ? }
? ? break;


使用该方法需要注意的是,普通用户是没有权限执行reboot和shutdown的,自然而然也无法实现关机或重启。使用的Android设备必须已经root过,上面的代码加上su命令其实也就是为了获取管理员权限。另外一点,需要注意的是,该方法能够奏效的前提是,你的android系统system/bin 目录下存在reboot和shutdown文件(其实跟上面的原理一样,也是调用bin目录下的文件),听说大部分设备存在reboot和shutdown这两个文件,可我使用的RK Android系统偏偏没有shutdown文件,所以,无法直接使用


Runtime.getRuntime().exec(new String[]{"su","-c","shutdown"})


只能执行下面命令来进行关机(好神奇的p参数)


Runtime.getRuntime().exec(new String[]{"su","-c","reboot -p"});


四 . PowerManager reboot以及反射调用PowerManagerService shutdown


1. PowerManager提供了reboot等接口,因此,利用PowerManager实现重启,就比较简单。


PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE);? //重启到fastboot模式
? ? pManager.reboot("");


2. PowerManager类并没有提供关机的shutdown接口,而是通过IBinder这种Android中特有的通信模式,与PowerManagerService 类进行通信。PowerManagerService是PowerManager 类中定义的接口的具体实现,并进一步调用Power 类来与下一层进行通信. 在PowerManagerService实现了shutdown接口,power服务实现了关机功能


PowerManager的实现通过IPowerManager来调用Power服务的接口。 IPowerManager是AIDL文件自动生成的类,便于远程通信。IPowerManage.aidl文件目录


framework/base/core/java/android/os/IPowerManage.aidl


IPowerManager实现了shutdown接口,所以,如果我们能够获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。
需要注意的是,ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder。
但ServiceManager这个类也是HIDE的,也需要反射进行调用。两次,通过两次反射调用,就能调用power服务实现的关机功能。


?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);
? ? ? ? ? ? ? ? ? //获得

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android Git忽略规则 下一篇Java语言基础组成—函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: