Android实现系统关机和重启

Android实现系统关机和重启


一、将APP提升至系统权限

在AndroidMenifest.xml中添加如下代码:
android:sharedUserId="android.uid.system"

二、 添加关机权限
<uses-permission android:name="android.permission.SHUTDOWN" />
注:经测试在AndroidMenifest.xml添加了该权限会有警告,而且不添加也可以实现关机,所以具体以运行的实际效果为主。

三、由于需要在源码中编译项目,所以要为项目编写mk文件,在项目根目录下添加Android.mk文件,内容如下所示:
LOCAL_PATH:= $(call my-dir)  
include $(CLEAR_VARS)  
  
LOCAL_MODULE_TAGS := optional  
  
LOCAL_SRC_FILES := $(call all-java-files-under, src)  
  
LOCAL_PACKAGE_NAME := PowerActionDemo  
LOCAL_CERTIFICATE := platform  
  
include $(BUILD_PACKAGE)

四、实现代码

4.1、关机代码

4.1.1 使用广播方式实现
/**
     * 关机
     *
     * @param v
     */
    public void shutDown(View v) {
        try {
            // 源码中"android.intent.action.ACTION_REQUEST_SHUTDOWN“ 就是 Intent.ACTION_REQUEST_SHUTDOWN方法
            Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
            // 源码中"android.intent.extra.KEY_CONFIRM"就是 Intent.EXTRA_KEY_CONFIRM方法,
            // 其中false换成true,会弹出是否关机的确认窗口
            intent.putExtra("android.intent.extra.KEY_CONFIRM", true);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
注:
代码中的“android.intent.action.ACTION_REQUEST_SHUTDOWN”就是Intent.ACTION_REQUEST_SHUTDOWN;
“android.inttent.extra.KEY_CONFIRM”就是Intent.EXTRA_KEY_CONFIRM.
由于在两个属性不对上层开放,所以就没有调用,直接写出来了;


4.1.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服务实现的关机功能。
/**
     * 关机
     * @param view
     */
    public void shutDown(View view) {
        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 (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }




4.2、 重启代码

4.2.1 使用广播方式实现
 /**
     * 重启
     *
     * @param v
     */
    public void reBoot(View v) {
        try {
            Intent intent2 = new Intent(Intent.ACTION_REBOOT);
            intent2.putExtra("nowait", 1);
            intent2.putExtra("interval", 1);
            intent2.putExtra("window", 0);
            sendBroadcast(intent2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


4.2.2 调用PowerManager的reboot方法实现
/**
     * 重启
     * @param view
     */
    public void reBoot(View view) {
        try {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            pm.reboot("");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android系统关机重启功能是通过多个层面的交互来实现的。首先,从按键触发中断开始,操作系统会将按键事件传递给Android框架层。然后,框架层会将这个事件再次传递回内核层,以执行关机重启任务。除了按键触发外,还可以通过其他方式触发重启,比如使用命令行工具reboot或者直接调用PowerManager的reboot()方法。 在具体的代码实现中,可以通过函数fastboot_register("reboot-bootloader", cmd_reboot_bootloader)将重启到引导加载程序(bootloader)的功能注册到系统中。这样,当执行该命令时,系统就会进入引导加载程序。 关于Android系统关机重启功能的具体实现,可以参考Android源代码中的PowerManager.java文件,其中包含了与关机重启相关的代码。在该文件中,有一个名为PM.reboot的方法,用于实现系统重启功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android关机重启流程](https://blog.csdn.net/mafei852213034/article/details/109818131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [android 系统重启关机流程分析](https://blog.csdn.net/vzvzvxz/article/details/7768361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值