当前位置:首页 » 安卓系统 » android关机的实现

android关机的实现

发布时间: 2022-12-11 01:26:53

❶ android 中如何实现关机、重启

主要思路:1、需要源码才能编译
2、修改项目的Android.mk文件,添加
LOCAL_CERTIFICATE := platform
3、AndroidManifest.xml中添加权限
3.1 manifest标签中添加
android:sharedUserId="android.uid.system"
3.2 使用权限
<uses-permission android:name="android.permission.SHUTDOWN"/
4、java代码
// 创建Intent
// 如果是要重启,则使用Intent.ACTION_REBOOT
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
// 设置是否需要用户确认,若不需要,可以不设置或设置为false
intent.putExtra(Intent.EXTRA_KEY_CONFIRM, true);
// 当作新任务执行
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 启动startActivity(intent);
据说还可以使用Broadcast的方式调用,不过我试了一下,窗口是出来了,但一直停在关机的进度条那。不知道是不是机子的问题。代码如下:Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
10-22 10:02 回答curie_871073

❷ android怎么样实现自动开关机

1.设置-备份与重置-自动开/关机,分别滑动开启“自动开机”和“自动关机”-然后设置自动开机/关机的“时间”及“天数”即可。
2.部分早期上市的C网手机:设定-关于手机-自动电源开/关-打钩即可。
3.若您的机器不支持定时开关机,但支持关机闹钟,设置关机闹钟后,当闹钟响铃前一分钟手机会自动开机。

❸ Android 关机(reboot)流程

->PowerManagerService中
lowLevelReboot()
SystemProperties.set("sys.powerctl", "reboot," + reason); //就传给Kernel进入reboot了

=》
那么接下来,走到哪里去了?
sys.powerctl 的配置在init.rc 当中,可以参考
on property:sys.powerctl=*
powerctl ${sys.powerctl}

然后执行system/core/init/builtins.c#do_powerctl 函数,call android_reboot 重启或者关机。
为何工厂模式下无法adb reboot ? 正常情况下adb reboot 可以重启, 其关键就是因为mediatek/config/{platform}factory_init.rc 中没有定义
on property:sys.powerctl=*
powerctl ${sys.powerctl}

如果要添加此功能,只有在factory_init.rc 中添加这两行即可
继续跟

=》在init.rc中和一个相关的on 触发器
396 on property:sys.powerctl=*
397 powerctl ${sys.powerctl}

=》会调用 builtins.c 的,参考间reboot,recovery
int do_powerctl(int nargs, char **args)

=>
return android_reboot(cmd, 0, reboot_target);
cmd = ANDROID_RB_RESTART2 //在android_reboot.h中#define ANDROID_RB_RESTART2 0xDEAD0003
reboot_target =第二个参考recovery

=》
/system/core/libcutils/android_reboot.c 中的执行android_reboot();

case ANDROID_RB_RESTART2:
121 ret = __reboot(linux_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
122 LINUX_REBOOT_CMD_RESTART2, arg); //arg = recovery

=>
这个在bionic/libc/include/sys/reboot.h中定义的。说明这是一个标准的系统调用
extern int __reboot(int, int, int, void *);

具体位于bionic/libc/arch-arm/syscalls/__reboot.S
1 /* autogenerated by gensyscalls.py */
2 #include <asm/unistd.h>
3 #include <linux/err.h>
4 #include <machine/asm.h>
5
6 ENTRY(__reboot)
7 mov ip, r7
8 ldr r7, =__NR_reboot
9 swi #0
10 mov r7, ip
11 cmn r0, #(MAX_ERRNO + 1)
12 bxls lr
13 neg r0, r0
14 b __set_errno
15 END(__reboot)

=》最后会进入Kernel
kernel/sys.c
case LINUX_REBOOT_CMD_RESTART2:
kernel_restart(buffer); //buffer = arg= recovery

=>machine_restart()

=>arch/arm/kernel/process.c
void machine_restart(char *cmd)

=》
void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart;
=》
void arm_machine_restart(char mode, const char *cmd)
{
...
aml_write_reg32(P_AO_RTI_STATUS_REG1, reboot_reason); //这一个标志寄存器
...

arch_reset(mode, cmd); // mode = 'h' cmd = "recovery"
}

❹ android 系统关机 调用什么方法

系统关机,可以发送一个广播,如下代码:
一. 发送广播方式
Broadcast是Android的四大基本组件之一,也就是我们常说的广播。Android系统本身就包含了许多广播,时时刻刻在监听着系统中注册的每一个广播并随时准备响应操作。其中,就有关于关机或重启的广播:Intent.ACTION_REQUEST_SHUTDOWN和Intent.ACTION_REBOOT,通过发送这两个广播,Android就能自动接收广播,并响应关机或

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

Intent.java位于源码/frameworks/base/core/java/android/content/Intent.java下面。具体实现方法如下

//广播方式关机重启
case R.id.shutdown_btn1:
Log.v(TAG, "broadcast->shutdown");
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
//其中false换成true,会弹出是否关机的确认窗口
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
break;
case R.id.reboot_btn1:
Log.v(TAG, "broadcast->reboot");
Intent intent2 = new Intent(Intent.ACTION_REBOOT);
intent2.putExtra("nowait", 1);
intent2.putExtra("interval", 1);
intent2.putExtra("window", 0);
sendBroadcast(intent2);
break;

需要注意的几点是:
第一,如前面所说,需要将APP提升至系统权限,具体做法是在AndroidMenifest.xml中添加如下代码

android:sharedUserId="android.uid.system"

第二,同时需要添加关机权限

<uses-permission android:name="android.permission.SHUTDOWN"></uses-permi

❺ 华为平板电脑怎样关机

平板电脑应该和手机是差不多的吧?你可以在那个界面上面长按一下,然后就可以关掉了呗,要不就按很久的话,不用在屏幕上确认了,也可以的。

❻ android 关机重启流程

https://developer.android.com/intl/zh-CN/reference/android/os/PowerManager.html

在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: https://blog.csdn.net/leerobin83/article/details/7162751

上面主要讲到流程,在实际开发中, 主动调用系统开机关机如何做
(Ref: https://blog.csdn.net/luzhenrong45/article/details/42092007 )
一. 发送系统广播方式
二. 通过init.rc启动系统服务来运行sh文件
三. Runtime调用Linux-shell
四 . PowerManager reboot以及反射调用PowerManagerService shutdown
五.使用ShutdownThread (尝试不成功,但想法觉得可行)

Intent.java位于源码/frameworks/base/core/java/android/content/Intent.java下面

脚本方式,实际都是基于指令的

使用PowerManager 或ShutdownThread 都是基于关机流程

❼ android 中如何实现关机,重启

关机命令

Runtime.getRuntime().exec("su -c \"/system/bin/shutdown\"");

重启命令

Runtime.getRuntime().exec("su -c \"/system/bin/reboot\"");

注意:手机必须root,否则这两个命令无法执行。

安卓手机怎么设置自动关机

如果您使用的是华为手机,以华为Mate 40手机为例:
1、进入设置 > 辅助功能 > 定时开关机 ,开启定时开关机开关。
2、设置开机时间、关机时间及重复周期。系统将在设定的时间自动关机或开机。
若要取消定时开关机功能,请关闭定时开关机开关。

热点内容
宝马五系降价取消了哪些配置 发布:2025-03-16 16:09:41 浏览:239
学班java 发布:2025-03-16 16:09:00 浏览:597
切金砖解压 发布:2025-03-16 16:08:45 浏览:773
数据库流向图 发布:2025-03-16 16:08:14 浏览:35
sql存储过程更新 发布:2025-03-16 16:08:13 浏览:161
安卓手机为什么比苹果耗流量高 发布:2025-03-16 16:06:32 浏览:229
荣耀加密指纹 发布:2025-03-16 16:02:27 浏览:398
sql判断数据库是否存在 发布:2025-03-16 16:01:17 浏览:908
怎么从ps里面看电脑配置 发布:2025-03-16 16:00:37 浏览:47
密码破译有什么连续剧 发布:2025-03-16 16:00:27 浏览:800