Android 实现关机的多种方式

想要在代码中实现关机需要 apk 有系统权限,要在 manifest 文件添加 android:sharedUserId=“android.uid.system”,还要有系统签名。

第一种方式

直接使用 adb shell 命令,调用 reboot 命令来关机

try {
    Runtime.getRuntime().exec("reboot -p"); //关机
} catch (IOException e) {
    e.printStackTrace();
}

第二种方式

调用 PowerManage 中的 shutdown 方法,但是该方法是隐藏的 API,通过反射即可调用,代码如下:

try {
    PowerManager pManager = (PowerManager) VfiServiceApp.getContext().getSystemService(Context.POWER_SERVICE);
    if (pManager != null) {
        Method method = pManager.getClass().getMethod("shutdown", boolean.class, String.class, boolean.class);
        method.invoke(pManager, false, null, false);
    }
} catch (Exception e) {
    e.printStackTrace();
}

第三种方式

发送广播

Broadcast

Intent.ACTION_REQUEST_SHUTDOWN关机广播
Intent.ACTION_REBOOT重启广播

ACTION_REQUEST和ACTION_REBOOT是Intent.java是声明的两个字符串常量,系统接收到这两个广播后就会响应关机或重启的操作。
源码中的实现如下:
声明代码路径:/frameworks/base/core/java/android/content/Intent.java

public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN"
public static final String ACTION_REBOOT = "android.intent.action.REBOOT"

权限:

  • AndroidMenifest.xml中添加代码

android:sharedUserId="android.uid.system"提升至系统权限
<uses-permission android:name="android.permission.SHUTDOWN" />添加关机权限

  • 需要在源码中编译项目,所以需要在项目根目录下添加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)   

第四种方式

通过init.rc启动系统服务来运行sh文件

Android文件系统启动后首先调用/init,init文件会解析init.rc和init.xxx.rc然后执行,init.rc会在系统初始化过程中做一些简单的初始化操作,可以利用init过程解析自己加进去的关机或重启脚本。

编写关机或重启脚本sh文件

#!/system/bin/sh
reboot
#!/system/bin/sh
reboot -p    #或者shutdown

编写mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PREBUILT_EXECUTABLES := system_shutdown.sh system_reboot.sh
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)  

修改init.rc文件,在文件最后添加如下:

 service system_shutdown /system/bin/system_shutdown.sh  #第一步中的sh文件名
        oneshot  #只启动一次
        disabled #禁用服务,不会开机自启动,但是可以在应用程序中手动启动
service system_reboot /system/bin/system_reboot.sh
        oneshot
        disabled  

新建目录,将上面的mk文件和两个sh脚本放到目录下,然后将文件夹副指导系统路径中,然后编译源码。
即可在代码中调用系统服务重启或关机

SystemProperties.set("ctl.start", "system_shutdown"); //system_shutdown是sh脚本的文件名
SystemProperties.set("ctl.start", "system_reboot");  

第五种方式

通过init.rc启动系统服务来运行sh文件(也是最常用的方法)

 //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;   

前提是android系统system/bin 目录下存在reboot和shutdown文件,大多数型号的设备都是有的。
设备需要获取root权限。

第六种方式

PowerManager提供了reboot接口

PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE);
pManager.reboot(null);//重启

以上就是Android 实现关机的多种方式的详细内容,更多关于Android 实现关机的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android 6.0开发实现关机菜单添加重启按钮的方法

    本文实例讲述了Android 6.0开发实现关机菜单添加重启按钮的方法.分享给大家供大家参考,具体如下: 修改: /trunk/LINUX/android/frameworks/base/core/res/res/values/config.xml 添加数组name为config_globalActionsList的值 修改: /LINUX/android/frameworks/base/services/core/java/com/android/server/policy/GlobalAct

  • Android开发实现长按返回键弹出关机框功能

    本文实例讲述了Android开发实现长按返回键弹出关机框功能.分享给大家供大家参考,具体如下: 今天刚好在PhoneWindowManager.java下看,当看到长按Home键的功能时,突然想到是不是可以长按back键来弹出关机框. 有想法就试试呗.当然想法是根据长按home键来的,那么我们应该可以模仿长按Home键来做.经过一番实验,貌似好像可以,拿出来给大家分享一下!!! 先找到PhoneWindowManager.java文件,在framework/base/policy/src/com

  • Android仿苹果关机界面实现代码

    本文实例为大家分享了Android仿苹果关机界面的具体代码,供大家参考,具体内容如下 主class 用来控制viewdialog的显示 package com.android.server.policy; import android.app.AlertDialog; import android.app.StatusBarManager; import android.os.Handler; import android.os.Message; import android.os.Remote

  • Android 修改系统关机动画的实现

    在Android 系统移植做自己的移动设备,肯定会遇到更改开机或者关机画面,配置自己产品logo 这点是必须的,这些都要在源码中修改,然后编译,下面给大家介绍个关机动画修改,一个简单示例! 文件路径:frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java 在beginShutdownSequence()方法中: private static void beginShutdownSequence

  • Android实现关机与重启的几种方式(推荐)

    下面我们来探究Android如何实现关机,重启:在Android中这种操作往往需要管理员级别,或者root Android实现的方式如下几种: 默认的SDK并没有提供应用开发者直接的Android系统关机或重启的API接口,一般来讲,实现Android系统的关机或重启,需要较高的权限(系统权限甚至Root权限).所以,在一般的APP中,如果想要实现关机或重启功能,要么是在App中声明系统权限,要么是通过某种"间接"的方式,比如广播或反射,来间接实现系统关机或重启.再者,就是放在源码环境

  • Android系统关机的全流程解析

    在PowerManager的API文档中,给出了一个关机/重启接口: public void reboot (String reason) 对于这个接口的描述很简单,就是几句话. 接口的作用就是重启设备,而且,就算重启成功了也没有返回值. 需要包含REBOOT权限,也就是android.permission.REBOOT 唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null. 一.上层空间 1.frameworks/base/core/java/android/

  • Android下的CMD命令之关机重启及重启recovery

    Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有实用性很强的关机重启软件,我们去百度上搜索一下. 截图: 一.了解CMD 命令 我们在cmd下进行的操作什么的,这里就不一一细说了我们只要知道下面这几条命令就可以了 重启:su -c reboot 关机:reboot -p 有了这个思路,我们就可以去实现了 activity_main.xml <LinearLayout xmlns:android="http://schemas.andr

  • Android平台预置GMS包后关机闹钟失效问题及解决方法

    1.介绍 关机闹钟为Android中默认支持的功能,实现起来则需要满足一定的条件:自动开机.开机后响铃.对于自动开机来说,自动关机可以在应用层通过设置alarm来实现,而自动开机需要底层rtc时钟的支持:开机后检查时间,到点响铃. 2.原理 一般智能手机的硬件架构都是分为RF,BB,AP这三个部分, RF射频部分的功能主要是接收和发射射频,大家不用关注这个.而AP部分就是应用程序处理器,其实也就是CPU模块:BB部分则是基带模块.通常手机关机都是AP模块完全断电,而BB虽然处在关机状态,但实际上

  • android实现短按电源键关机的实现代码

    打开文件:\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java 在代码: private static final int MSG_POWER_LONG_PRESS = 14;下面添加: private static final int MSG_POWER_SHUT_DOWN=15; 在: case MSG_POWER_LONG_PRESS: powerLongPress(); b

  • Android实现关机后数据不会丢失问题

    要实现关机后数据也不会丢失,需要使用到 AndroidViewModel,SaveStateHandle 和 SharePreferences 要达到的目的就是将数据保存成这个亚子 就不会出现app在异常闪退或者关机后数据的丢失了注意在使用SaveStateHandle和binding的时候需要在gradle里面设置一波 数据类 package com.example.applicationtest04; import android.app.Application; import androi

随机推荐