1
)、
PowerManager.java
該檔案定義了一個
PowerManager
類供其它檔案使用,該類嵌套了一個
nest class
:
public class WakeLock
,該
nest class
有如下方法:
public void setReferenceCounted(boolean value) public void acquire() public void acquire(long timeout) public void release() public void release(int flags) public boolean isHeld() public String toString() @Override protected void finalize() throws Throwable |
該
nest class
的構造方法為:
WakeLock(int flags, String tag)
其中有一個關鍵的參數
flags
,它有如下幾種情況:
PARTIAL_WAKE_LOCK: Screen off, keyboard light off
SCREEN_DIM_WAKE_LOCK: screen dim, keyboard light off
SCREEN_BRIGHT_WAKE_LOCK: screen bright, keyboard light off
FULL_WAKE_LOCK: screen bright, keyboard bright
上面4
種是互斥的,即只能指定其中之一,但可以與下面兩種flag
不是互斥的:
ACQUIRE_CAUSES_WAKEUP:
一旦有請求鎖時強制開啟
Screen
和
keyboard light
ON_AFTER_RELEASE:
在釋放鎖時
reset activity timer
除了這個內部類,
powermanager
類定義了如下方法:
public WakeLock newWakeLock(int flags, String tag) //
該方法 return 一個 nest class 的一個對象。而我們看到, nest class 實際上完成了 WakeLock 的申請與釋放 public void userActivity(long when, boolean noChangeLights) public void goToSleep(long time) public void setBacklightBrightness(int brightness) public int getSupportedWakeLockFlags() public boolean isScreenOn() |
該類的構造方法有兩個:
private PowerManager()
public PowerManager(IPowerManager service, Handler handler)
2
、
Power.java
PowerManagerSerivive.java
中調用了一些本地方法,該檔案作為這些方法的
java
層與
jni
的中介層,聲明了本地介面。
public static native void acquireWakeLock(int lock, String id); public static native void releaseWakeLock(String id); public static native int setScreenState(boolean on); public static native int setLastUserActivityTimeout(long ms); @Deprecated public static native void shutdown(); public static void reboot(String reason) throws IOException |
3
、
andriod_ow_Power.cpp
該檔案編寫了本地實現方法,從本地方法列表可以知道該本地方法與
power.c
是密切相關的:
static JNINativeMethod method_table[] = { { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock }, { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock }, { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout }, { "setScreenState", "(Z)I", (void*)setScreenState }, { "shutdown", "()V", (void*)android_os_Power_shutdown }, { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot }, }; |
4
、
power.c
該檔案作為
Android
系統的最底層,與
Linux
核心的
power manager
互動。
static int64_t systemTime()
;
static int open_file_descriptors(const char * const paths[])
;
static inline void initialize_fds(void)
;
int acquire_wake_lock(int lock, const char* id)
;
int set_last_user_activity_timeout(int64_t delay)
;
int set_screen_state(int on)
;