最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)關(guān)機(jī)與重啟的幾種方式(推薦)

 更新時(shí)間:2016年07月15日 10:08:47   作者:致我那些年搬過(guò)的磚  
這篇文章主要介紹了Android實(shí)現(xiàn)關(guān)機(jī)與重啟的幾種方式(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

下面我們來(lái)探究Android如何實(shí)現(xiàn)關(guān)機(jī),重啟;在Android中這種操作往往需要管理員級(jí)別,或者root

Android實(shí)現(xiàn)的方式如下幾種:

默認(rèn)的SDK并沒(méi)有提供應(yīng)用開發(fā)者直接的Android系統(tǒng)關(guān)機(jī)或重啟的API接口,一般來(lái)講,實(shí)現(xiàn)Android系統(tǒng)的關(guān)機(jī)或重啟,需要較高的權(quán)限(系統(tǒng)權(quán)限甚至Root權(quán)限)。所以,在一般的APP中,如果想要實(shí)現(xiàn)關(guān)機(jī)或重啟功能,要么是在App中聲明系統(tǒng)權(quán)限,要么是通過(guò)某種“間接”的方式,比如廣播或反射,來(lái)間接實(shí)現(xiàn)系統(tǒng)關(guān)機(jī)或重啟。再者,就是放在源碼環(huán)境中進(jìn)行編譯,這樣做有一個(gè)好處,就是可以直接調(diào)用Android中不公開的API,這是Eclipse+SDK沒(méi)法達(dá)到的效果。下面是我自己嘗試的幾種方式:

一. 發(fā)送廣播方式

Broadcast是Android的四大基本組件之一,也就是我們常說(shuō)的廣播。Android系統(tǒng)本身就包含了許多廣播,時(shí)時(shí)刻刻在監(jiān)聽著系統(tǒng)中注冊(cè)的每一個(gè)廣播并隨時(shí)準(zhǔn)備響應(yīng)操作。其中,就有關(guān)于關(guān)機(jī)或重啟的廣播:Intent.ACTION_REQUEST_SHUTDOWN和Intent.ACTION_REBOOT,通過(guò)發(fā)送這兩個(gè)廣播,Android就能自動(dòng)接收廣播,并響應(yīng)關(guān)機(jī)或重啟的操作。ACTION_REQUEST和ACTION_REBOOT是Intent.java是聲明的兩個(gè)字符串常量

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下面。具體實(shí)現(xiàn)方法如下

//廣播方式關(guān)機(jī)重啟
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,會(huì)彈出是否關(guān)機(jī)的確認(rèn)窗口
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;

需要注意的幾點(diǎn)是:

第一,如前面所說(shuō),需要將APP提升至系統(tǒng)權(quán)限,具體做法是在AndroidMenifest.xml中添加如下代碼

android:sharedUserId="android.uid.system"

第二,同時(shí)需要添加關(guān)機(jī)權(quán)限

第三,在Eclipse中,代碼中的Intent.ACTION_REQUEST_SHUTDOWN 及 Intent.EXTRA_KEY_CONFIRM 在Eclipse IDE中報(bào)錯(cuò),還是和前面說(shuō)的一樣,這兩個(gè)屬性不對(duì)上層開放,如果把項(xiàng)目放在源碼中進(jìn)行編譯,是可以編譯通過(guò)的。

第四,由于需要在源碼中編譯項(xiàng)目,所以需要為項(xiàng)目編寫mk文件,在項(xiàng)目根目錄下添加Android.mk文件,內(nèi)容如下所示:

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)

最后,將編譯生成的apk文件,通過(guò)adb push到機(jī)器上就可以驗(yàn)證功能了。

二. 通過(guò)init.rc啟動(dòng)系統(tǒng)服務(wù)來(lái)運(yùn)行sh文件

Android啟動(dòng)文件系統(tǒng)后調(diào)用的會(huì)調(diào)用第一個(gè)應(yīng)用程序是/init,此文件一個(gè)很重要的內(nèi)容就是解析了init.rc和init.xxx.rc,然后執(zhí)行解析出來(lái)的任務(wù)。而init.rc,可以在系統(tǒng)的初始化過(guò)程中進(jìn)行一些簡(jiǎn)單的初始化操作。利用這一點(diǎn),可以編寫簡(jiǎn)單的關(guān)機(jī)或重啟的sh腳本文件,通過(guò)系統(tǒng)init解析,執(zhí)行相應(yīng)的關(guān)機(jī)或重啟操作。

1.首先,編寫關(guān)機(jī)和重啟的sh腳本。比如,新建

重啟腳本 system_reboot.sh,內(nèi)容如下:

#!/system/bin/sh
reboot

關(guān)機(jī)腳本 system_shutdown.sh

#!/system/bin/sh
reboot -p

注意:此處關(guān)機(jī)命令并不是shutdown,而是reboot -p

2. 編寫Android.mk編譯腳本,目的是在源碼編譯的時(shí)候,將這兩個(gè)sh文件一起編譯到/system/bin目錄下

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)

3. init.rc添加關(guān)機(jī)和重啟的服務(wù),打開init.rc文件,在最后面添加如下內(nèi)容:

service system_shutdown /system/bin/system_shutdown.sh
oneshot
disabled 
service system_reboot /system/bin/system_reboot.sh
oneshot
disabled

oneshot選項(xiàng)表示該服務(wù)只啟動(dòng)一次,而如果沒(méi)有oneshot選項(xiàng),這個(gè)可執(zhí)行程序會(huì)一直存在--如果可執(zhí)行程序被殺死,則會(huì)重新啟動(dòng)。

disabled 表示禁用服務(wù),此服務(wù)開機(jī)時(shí)不會(huì)自動(dòng)啟動(dòng),但是可以在應(yīng)用程序中手動(dòng)啟動(dòng)它。

4.新建一個(gè)目錄,比如poweraction, 將以上的Android.mk , system_shutdown.sh, system_reboot.sh放在這個(gè)目錄下,然后將poweraction這個(gè)目錄拷貝到Android系統(tǒng)中,比如device路徑下面。然后,編譯Android源碼,源碼編譯完成后, 查看生成的out/.../system/bin下面是不是包含system_shutdown.sh, system_reboot.sh兩個(gè)sh文件,如果有,則說(shuō)明編譯成功。

5.最后,啟動(dòng)系統(tǒng)服務(wù),進(jìn)行關(guān)機(jī)或重啟。

//啟動(dòng)系統(tǒng)服務(wù)進(jìn)行關(guān)機(jī)或重啟
case R.id.shutdown_btn2:
Log.v(TAG, "system service->shutdown");
SystemProperties.set("ctl.start", "system_shutdwon");
break;
case R.id.reboot_btn2:
Log.v(TAG, "system service->reboot");
SystemProperties.set("ctl.start", "system_reboot");
break;

三. Runtime調(diào)用Linux-shell

我們知道,Runtime這個(gè)Java類是可以用來(lái)調(diào)用并執(zhí)行shell命令的,而Android虛擬機(jī)是支持Linux-shell語(yǔ)言的,基于這一點(diǎn),可以利用Runtime來(lái)執(zhí)行 關(guān)機(jī)或重啟的shell命令,這一點(diǎn)和上面介紹的方式二原理上大致相同。功能代碼如下:

//Runtime執(zhí)行l(wèi)inux-shell
case R.id.shutdown_btn3:
try{
Log.v(TAG, "root Runtime->shutdown");
//Process proc =Runtime.getRuntime().exec(new String[]{"su","-c","shutdown"}); //關(guān)機(jī)
Process proc =Runtime.getRuntime().exec(new String[]{"su","-c","reboot -p"}); //關(guān)機(jī)
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 "}); //關(guān)機(jī)
proc.waitFor();
}catch (Exception ex){
ex.printStackTrace();
}
break;

使用該方法需要注意的是,普通用戶是沒(méi)有權(quán)限執(zhí)行reboot和shutdown的,自然而然也無(wú)法實(shí)現(xiàn)關(guān)機(jī)或重啟。使用的Android設(shè)備必須已經(jīng)root過(guò),上面的代碼加上su命令其實(shí)也就是為了獲取管理員權(quán)限。另外一點(diǎn),需要注意的是,該方法能夠奏效的前提是,你的android系統(tǒng)system/bin 目錄下存在reboot和shutdown文件(其實(shí)跟上面的原理一樣,也是調(diào)用bin目錄下的文件),聽說(shuō)大部分設(shè)備存在reboot和shutdown這兩個(gè)文件,可使用的Android系統(tǒng)偏偏沒(méi)有shutdown文件,所以,無(wú)法直接使用

Runtime.getRuntime().exec(new String[]{"su","-c","shutdown"})

只能執(zhí)行下面命令來(lái)進(jìn)行關(guān)機(jī)(好神奇的p參數(shù))

Runtime.getRuntime().exec(new String[]{"su","-c","reboot -p"});

四 . PowerManager reboot以及反射調(diào)用PowerManagerService shutdown

1. PowerManager提供了reboot等接口,因此,利用PowerManager實(shí)現(xiàn)重啟,就比較簡(jiǎn)單。

PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE); //重啟到fastboot模式
pManager.reboot("");

2. PowerManager類并沒(méi)有提供關(guān)機(jī)的shutdown接口,而是通過(guò)IBinder這種Android中特有的通信模式,與PowerManagerService 類進(jìn)行通信。PowerManagerService是PowerManager 類中定義的接口的具體實(shí)現(xiàn),并進(jìn)一步調(diào)用Power 類來(lái)與下一層進(jìn)行通信. 在PowerManagerService實(shí)現(xiàn)了shutdown接口,power服務(wù)實(shí)現(xiàn)了關(guān)機(jī)功能
PowerManager的實(shí)現(xiàn)通過(guò)IPowerManager來(lái)調(diào)用Power服務(wù)的接口。 IPowerManager是AIDL文件自動(dòng)生成的類,便于遠(yuǎn)程通信。IPowerManage.aidl文件目錄

framework/base/core/java/android/os/IPowerManage.aidl

IPowerManager實(shí)現(xiàn)了shutdown接口,所以,如果我們能夠獲得Power服務(wù)的IBinder,通過(guò)反射調(diào)用shutdown方法就能實(shí)現(xiàn)關(guān)機(jī)功能。

需要注意的是,ServiceManager管理著系統(tǒng)的服務(wù)程序,它保存著所有服務(wù)的IBinder,通過(guò)服務(wù)名就能獲取到這個(gè)服務(wù)的IBinder。

但ServiceManager這個(gè)類也是HIDE的,也需要反射進(jìn)行調(diào)用。兩次,通過(guò)兩次反射調(diào)用,就能調(diào)用power服務(wù)實(shí)現(xiàn)的關(guān)機(jī)功能。

try {
//獲得ServiceManager類
Class> ServiceManager = Class
.forName("android.os.ServiceManager");
//獲得ServiceManager的getService方法
Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
//調(diào)用getService獲取RemoteService
Object oRemoteService = getService.invoke(null,Context.POWER_SERVICE);
//獲得IPowerManager.Stub類
Class> cStub = Class
.forName("android.os.IPowerManager$Stub");
//獲得asInterface方法
Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
//調(diào)用asInterface方法獲取IPowerManager對(duì)象
Object oIPowerManager = asInterface.invoke(null, oRemoteService);
//獲得shutdown()方法
Method shutdown = oIPowerManager.getClass().getMethod("shutdown",boolean.class,boolean.class);
//調(diào)用shutdown()方法
shutdown.invoke(oIPowerManager,false,true); 
} catch (Exception e) { 
Log.e(TAG, e.toString(), e); 
}

以上所述是小編給大家介紹的Android實(shí)現(xiàn)關(guān)機(jī)與重啟的幾種方式(推薦),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android自定義RecyclerView Item頭部懸浮吸頂

    Android自定義RecyclerView Item頭部懸浮吸頂

    這篇文章主要為大家詳細(xì)介紹了Android自定義RecyclerView Item頭部懸浮吸頂,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Kotlin如何直接使用控件ID原理詳析

    Kotlin如何直接使用控件ID原理詳析

    這篇文章主要給大家介紹了關(guān)于Kotlin如何直接使用控件ID原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Android列表實(shí)現(xiàn)(2)_游標(biāo)列表案例講解

    Android列表實(shí)現(xiàn)(2)_游標(biāo)列表案例講解

    最近開始學(xué)習(xí)android的ui 游標(biāo)列表實(shí)現(xiàn),先上幾個(gè)相關(guān)的例子,后續(xù)還會(huì)有更新,感興趣的朋友可以研究下
    2012-12-12
  • Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)

    Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)

    這篇文章主要為大家介紹了Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android通過(guò)Movie展示Gif格式圖片

    Android通過(guò)Movie展示Gif格式圖片

    這篇文章主要介紹了Android通過(guò)Movie展示Gif格式圖片的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Android中屏幕密度和圖片大小的關(guān)系詳解

    Android中屏幕密度和圖片大小的關(guān)系詳解

    這篇文章主要介紹了Android中屏幕密度和圖片大小的關(guān)系詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • android電源信息查看(電量、溫度、電壓)實(shí)例代碼

    android電源信息查看(電量、溫度、電壓)實(shí)例代碼

    這篇文章主要介紹了android電源信息查看方法,以實(shí)例形式較為詳細(xì)的分析了Android實(shí)現(xiàn)電源電量、電壓、溫度等信息查看的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • 解決android 顯示內(nèi)容被底部導(dǎo)航欄遮擋的問(wèn)題

    解決android 顯示內(nèi)容被底部導(dǎo)航欄遮擋的問(wèn)題

    今天小編就為大家分享一篇解決android 顯示內(nèi)容被底部導(dǎo)航欄遮擋的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 21天學(xué)習(xí)android開發(fā)教程之XML解析與生成

    21天學(xué)習(xí)android開發(fā)教程之XML解析與生成

    21天學(xué)習(xí)android開發(fā)教程之XML解析與生成,使用SAX來(lái)解析XML,在Android里面可以使用SAX和DOM,DOM需要把整個(gè)XML文件讀入內(nèi)存再解析,比較消耗內(nèi)存,而SAX基于事件驅(qū)動(dòng)的處理方式,可以在各節(jié)點(diǎn)觸發(fā)回調(diào)函數(shù),需要的朋友可以參考下
    2016-02-02
  • Android 中Activity 之間傳遞參數(shù)

    Android 中Activity 之間傳遞參數(shù)

    這篇文章主要介紹了Android 中Activity 之間傳遞參數(shù)的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

华宁县| 天津市| 靖远县| 资兴市| 涟水县| 大足县| 贵港市| 成安县| 安达市| 突泉县| 游戏| 博湖县| 右玉县| 兴仁县| 红安县| 班玛县| 保康县| 安徽省| 宝兴县| 武强县| 尼玛县| 涪陵区| 永定县| 秦皇岛市| 阿克| 京山县| 晋城| 县级市| 宜城市| 肃北| 红安县| 宽甸| 姜堰市| 冷水江市| 若尔盖县| 遵化市| 成都市| 师宗县| 清水县| 广西| 邹平县|