Android調用系統關機與重啟功能


   我是在android源碼里編譯的package/apps/,因為需要調用的關機接口是不對上層開放的,在eclipse里面不能調用。

   我主要是介紹調用android的關機功能,因為在調試過程中,關機的一些權限和其他條件是多於重啟的,所以,如果能實現關機,那么重啟也就沒有問題了。

 

  在AndroidManifest.xml中加入語句  android:sharedUserId="android.uid.system"  與系統一樣的uid,將apk提升為系統權限

該語句加在版本號后。

  然后再寫入一條系統權限<uses-permission android:name="android.permission.SHUTDOWN"/>

該權限只有系統級apk才能使用,所以eclipse也不能編譯。

 

   之后,在xml中寫兩個button,一個關機,一個重啟,在此不介紹xml了。 

 

   實現重啟,需要調用android.intent.action.REBOOT, 該接口對上層開放,可以直接調用:

case R.id.reboot_btn:
            Intent intent=new Intent(Intent.ACTION_REBOOT);
            intent.putExtra("nowait", 1);
            intent.putExtra("interval", 1);
            intent.putExtra("window", 0);
            sendBroadcast(intent);
            break;

最后sendBroadcast也是系統級apk才可以發送。

    

     實現關機,需要調用android.intent.action.ACTION_REQUEST_SHUTDOWN,此接口不對上層開放,在eclipse中是不能調用的,但是在源碼中是有的,所以在源碼中編譯apk不會報錯。

     

public static final String ACTION_REQUEST_SHUTDOWN="android.intent.action.ACTION_REQUEST_SHUTDOWN"

public static final String EXTRA_KEY_CONFIRM="android.intent.extra.KEY_CONFIRM"

Intent i=new Intent(ACTION_REQUEST_SHUTDOWN);
            i.putExtra(EXTRA_KEY_CONFIRM, false);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);

 

我看了好多博客,都是寫的 Intent i=new Intent(Intent.ACTION_REQUEST_SHUTDOWN);

我試過了,就算在linux里面編譯也會報錯,所以這里是需要自己定義一個常量的,然后直接使用這個常量,千萬不要用Intent點出來。

EXTRA_KEY_CONFIRM這個也需要自己定義,也沒對上層開放。

 

因為是在linux下編譯,所以需要寫個Android.mk文件,可以去復制其他apk的該文件,稍做修改

  LOCAL_PATH:= $(call my-dir)
  include $(CLEAR_VARS)
  
  LOCAL_MODULE_TAGS := optional
  
  # Only compile source java files in this apk.
  LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
  LOCAL_SDK_VERSION := current
  
  LOCAL_PACKAGE_NAME := Reboot
  
  LOCAL_CERTIFICATE := platform
  
  LOCAL_DEX_PREOPT :=false
  
  include $(BUILD_PACKAGE)
  
  # Use the following include to make our test apk.
  include $(call all-makefiles-under,$(LOCAL_PATH))

我對mk文件不是很了解,說一下關鍵的地方:

    LOCAL_PACKAGE_NAME:= 項目名

4.0以上編譯apk需要加入 LOCAL_DEX_PREOPT := false 才能編譯生成APK文件,默認true生成的不可獨立安裝運行

一定要加上該句 LOCAL_CERTIFICATE := platform  獲取系統權限

我看到有人說要刪掉bin目錄,具體作用不清除,反正我刪掉了

然后在android源碼根目錄 . build/envsetup.sh

再lunch 一個版本

進入項目有mk文件的目錄 執行mm

編譯出的apk路徑在:out/target/product/anzhen4_mrd7/system/app/Reboot.apk

 

今天又找了下資料

關機的那個 Activity 就是 ShutDownActiviy,其又調用 ShutdownThread.shutdown。

重啟的相關的類在 WatchDog.java(定義了相關的量), 其內部類 RebootRequestReceiver 是主要代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM