安卓关机java代码 安卓java启动器
java实现关机
import java.util.*;
创新互联是一家以网络技术公司,为中小企业提供网站维护、成都网站设计、成都网站建设、外贸网站建设、网站备案、服务器租用、主机域名、软件开发、重庆小程序开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站欢迎联系:18980820575
import java.io.*;
class Shutdown
{
public static void main(String[] args)
{
System.out.println("Shutdown in 10s");
try{
Runtime.getRuntime().exec("cmd /c Shutdown -t 10");
}catch(IOException e){}
}
}
上面这个程序实现你所说的定时10秒关机
至于定时开机...你告诉我怎么在关机的状态下执行我的程序,我就把开机的程序给你写出来.
安卓手机怎么关机
vivo手机关机操作:
1、亮屏状态下,长按电源键,弹出对话框后,选择关机或重启;
2、调出控制中心--关机,弹出对话框后,选择关机或重启;
若执行查找设备锁定屏幕或丢失模式指令后,需同时按住音量加键、音量减键和电源键强制关机;另若有更多疑问可以及时联系在线客服咨询反馈,可进入vivo官网/vivo商城APP--我的--在线客服或者点击vivo官网网页版--下滑底部--在线客服--输入人工客服进入咨询在线客服反馈。
android完整的java关机代码?
必须有root权限的才可以,有的话执行命令行就可以了
Runtime.getRuntime().exec(new String[]{ "su", "-c", "poweroff -f" });
Runtime.getRuntime().exec(new String[]{ "su", "-c", "reboot" });
android 关机重启流程
在PowerManager的API文档中,给出了一个关机/重启接口:
public void reboot (String reason)
对于这个接口的描述很简单,就是几句话。
接口的作用就是重启设备,而且,就算重启成功了也没有返回值。
需要包含REBOOT权限,也就是android.permission.REBOOT
唯一参数reason代表需要的特定重启模式,比如recovery,当然也可以为null。
1.frameworks/base/core/java/android/os/PowerManager.java
2.frameworks/base/core/java/android/os/IPowerManager.aidl
3.frameworks/base/services/java/com/android/server/PowerManagerService.java
4.frameworks/base/services/java/com/android/server/pm/ShutdownThread.java
5.frameworks/base/services/jni/com_android_server_PowerManagerService.cpp
---------------------》
6.system/core/libcutils/android_reboot.c
7.bionic/libc/unistd/reboot.c
8.__reboot通过syscall来到内核
9.kernel/sys.c
frameworks/base/core/java/android/os/PowerManager.java
mService为IPowerManager Binder接口服务。
frameworks/base/core/java/android/os/IPowerManager.aidl
frameworks/base/services/java/com/android/server/PowerManagerService.java
frameworks/base/services/java/com/android/server/pm/ShutdownThread.java
这里说明是需要重启,且不是安全模式,重启参数为传递下来的reason,shutdownInner的confirm参数是用来设置是否有确认提示框的,通过reboot接口调用重启是没有的,为false。
重启的实现在run()中,因为ShutdownThread是Thread的扩展,所以run会自动运行。
frameworks/base/services/java/com/android/server/pm/ShutdownThread.java
在重启前会将重启原因写入sys.shutdown.requested,如果没有则为空,如果是安全模式还会将persist.sys.safemode置1,之后会进行一些关机前的预处理,关闭ActivityManager以及MountService,最终调用rebootOrShutdown进行关机操作。
如果确认重启,则调用PowerManagerService的lowLevelReboot函数,参数就是传递下来的reason,稍后分析。如果不是重启,即mReboot=false,那就是需要关机了,在shutdown函数中就能够知道。
frameworks/base/services/java/com/android/server/PowerManagerService.java
frameworks/base/services/jni/com_android_server_PowerManagerService.cpp
可以看到无论是关机还是重启,都是调用android_reboot来实现的,只是参数不一样而已。
system/core/libcutils/android_reboot.c
以reboot recovery为例,arg即为recovery,所在在第五步的时候会传入ANDROID_RB_RESTART2。到了android_reboot函数中,会看到这样的定义#ifdef RECOVERY_PRE_COMMAND,即属于重启前会执行的命令,如果定义了就会执行。
下面也是做了一些关机重启前的预处理工作,sync()作用是将缓存中的信息写入磁盘,以免程序异常结束导致文件被损坏,linux系统关机前会做几次这样的动作;而remount_ro()作用是通过调用emergency_remount()强制将文件系统挂载为只读,不再允许任何写入操作,同时会通过检查/proc/mounts的设备状态来确认是否当前的所有写入工作已经完成,这个检查过程是阻塞操作。
接下来才是对参数的解析处理:
1)普通重启 ANDROID_RB_RESTART, reason = RB_AUTOBOOT;
2)关机 ANDROID_RB_POWEROFF, 无需reason,直接调用reboot进行关机;
3)带参数的特殊重启 ANDROID_RB_RESTART2, reason 将为默认值 -1
这里又出现一个#ifdef RECOVERY_PRE_COMMAND_CLEAR_REASON,如果定义了它,则无论上层传下来的参数是什么样的,最终都只是普通重启而已。定义它的方式是在BoardConfig.mk中加入TARGET_RECOVERY_PRE_COMMAND_CLEAR_REASON := true,应该有厂商会喜欢这么做的,毕竟除了普通重启,都可能带给用户一定的风险。
最后会对reason进行一个检测,那么通过上边的分析,其实只有带参数的特殊重启才会为-1,而不等于-1的情况中有普通重启和关机,而关机已经自行解决了……所以,不等于-1的情况到了这里也只有普通重启了。最终这里就是区分普通重启与特殊重启的地方了。这里再插入一个问题,其他的几个cmd都是什么值呢?答案在bionic/libc/include/sys/reboot.h中:
reboot(reason) - reboot(RB_AUTOBOOT) - __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART, NULL )
__reboot通过syscall来到内核bionic/libc/arch-arm/syscalls/__reboot.S
其被指定了一个固定的偏移量,在被调用的时候就是通过这个偏移量去内核中寻找对应的入口的,由此可见,内核中一定有着相同的定义,否则将不能成功调用。内核中对syscall偏移量的定义在内核源码中的arch/arm/include/asm/unistd.h,相关信息完全一致。
已经找到了内核中的对应映射,那么下一步就要去找寻真正的实现函数了,在include/asm-generic/unistd.h中可以找到内核对__NR_reboot的syscall函数映射,即
同时,能够发现如此温馨的一幕,内核已经指引我们下一步该去哪里寻找sys_reboot,即kernel/sys.c。
include/linux/syscalls.h
与__reboot的调用参数一致。
进入sys.c文件后,并没有找到名为sys_reboot的函数,而通过仔细查找,发现一个很有趣的函数,其定义为SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg),对比__reboot的参数,能够符合。究竟是不是这个函数?
同样在include/linux/syscalls.h文件中,能够找到这样几个定义:
而pm_power_off为空的话,就把用户的关机命令转换为挂起:
arch/arm/kernel/process.c
pm_power_off = msm_pm_power_off;
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg)
这个过程是用reboot_mutex互斥锁来进行保护的,以保证同一时间只可能有一个解析过程,避免冲突。
bionic/libc/include/sys/reboot.h 中可以看到android定义的启动方式
RESTART
POWER_OFF
RESTART2
对框架进行赋值,qcom 平台 845上已经不是这函数,自己查找
arm_pm_restart = msm_pm_restart;
下面是qcom 实现,每个平台不同
可以在跟踪这个流程的过程中会发现,确实是有存在关机的相关接口的。那么关机该怎么用呢?
frameworks/base/services/java/com/android/serverBatteryService.java
重启方式: 最后就是设定寄存器,Uboot 解析不同寄存器的值进入不同的启动模式
recovery 如果传下来的字符串是recovery那么,就在RTC寄存器里设置某个特定值,当uboot里读取RTC寄存器的时候如果获取了这个特定值,那就可以起recovery这个动作了。
Ref:
上面主要讲到流程,在实际开发中, 主动调用系统开机关机如何做
(Ref: )
一. 发送系统广播方式
二. 通过init.rc启动系统服务来运行sh文件
三. Runtime调用Linux-shell
四 . PowerManager reboot以及反射调用PowerManagerService shutdown
五.使用ShutdownThread (尝试不成功,但想法觉得可行)
Intent.java位于源码/frameworks/base/core/java/android/content/Intent.java下面
脚本方式,实际都是基于指令的
使用PowerManager 或ShutdownThread 都是基于关机流程
java语言的自动关机的代码
public class RuntimeTest {
public static void main(String[] args)
{
Runtime rt=Runtime.getRuntime();
try
{
rt.exec("shutdown.exe -s -t 40");
/*40的单位为秒,可以改成你想要的任何数字。
如果是想定时关机,可用这句:rt.exec("at 19:00 shutdown.exe -s");19:00可以换成你想要的时间*/
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
如何修改Android关机界面
这里主要是修改,系统调用关机时候的代码,已达到自己想要的结果。
长按POWER键,将会关机,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统弹出对话框的代码位于: framework\policies\base\phone\com\android\internal\policy\impl\PhoneWindowManager.java
显示对话框的代码如下:
Runnable mPowerLongPress = new Runnable() {
public void run(){
mShouldTurnOffOnKeyUp = false;
performHapticsFeedbackLw(null,HapticFeedbackConstants.LONG_PRESS,false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
} };
调用showGlobalActionDialog方法将会显示“飞行模式”、“静音”,“关机”,选项的对话框
这个时候我们就可以把位于此处的frameworks\policies\base\phone\com\android\internal\policy\impl\GlobalActions.java该文件的createDialog方法中代码:
mItems = Lists.newArrayList(
//静音模式
mSilentModelToggle,
//飞行模式
mAirplaneModeOn,
//最后,关机
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_power_off){
public void onPress(){
//shutdown by making sure radio and power are handled accordingly
ShutdownThread.shutdown(mContext,true);
}
public boolean showDuringKeyguard(){
return true;
}
public boolean showBefornProvisioning(){
return true;
}
});
上面的代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的Shutdown方法来关机。shutdown的方法的第二个参数标识是否弹出询问对话框。
我们可以修改PhoneWindowManager.java的代码,最终代码如下
Runnable mPowerLongPress = new Runnable(){
public void run(){
mShouldTurnOffOnKeyUp = false;
performHapticFeedbackLw(null,HapticFeedbackConstants.LONG_PRESS,false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTION);
//showGlobalActionsDialog();
ShutdownThread.shutdown(mContext,false);
}
};
网站栏目:安卓关机java代码 安卓java启动器
本文路径:http://pwwzsj.com/article/hgcjdc.html