android關機的實現
❶ 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、設置開機時間、關機時間及重復周期。系統將在設定的時間自動關機或開機。
若要取消定時開關機功能,請關閉定時開關機開關。