安卓關機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啟動器
標題URL:http://m.kartarina.com/article12/hgcjdc.html

成都網站建設公司_創新互聯,為您提供網站改版云服務器、品牌網站建設、企業建站、做網站、營銷型網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司
主站蜘蛛池模板: 国产精品多人p群无码| 国产在线精品无码二区二区| 国产av激情无码久久| 久久午夜伦鲁片免费无码| 久久老子午夜精品无码| 亚洲色无码专区在线观看| 一本加勒比HEZYO无码人妻| 日韩人妻无码精品专区| 亚洲AV永久无码精品成人| 日韩av无码一区二区三区| 亚洲熟妇无码八V在线播放| 国产精品亚洲专区无码WEB| 国产精品无码DVD在线观看| 国产网红主播无码精品| 色欲A∨无码蜜臀AV免费播 | 中文字幕乱妇无码AV在线| 亚洲熟妇无码乱子AV电影| 久久久久亚洲av无码专区导航 | 亚洲中文字幕无码日韩| 日韩免费无码一区二区三区| 人妻少妇乱子伦无码专区| 亚洲av日韩av无码黑人| 国模无码一区二区三区| 人妻少妇精品无码专区漫画| 中文字幕无码乱人伦| 性色av极品无码专区亚洲| 国产在线无码精品电影网| 亚洲精品无码专区久久| 国产精品无码无卡无需播放器| 久久午夜伦鲁片免费无码| 国产aⅴ无码专区亚洲av麻豆| 免费无码A片一区二三区| 国产午夜片无码区在线播放| 亚欧无码精品无码有性视频| 国产精品无码aⅴ嫩草| 久久精品aⅴ无码中文字字幕重口 久久精品国产亚洲AV无码娇色 | 国产精品JIZZ在线观看无码| 精品久久久久久无码不卡| 亚洲中文字幕不卡无码| 国产精品亚洲а∨无码播放麻豆 | 无码国产成人午夜电影在线观看|