Android-WakeLock(起動ロックとCPUスリープ/画面常亮)
5119 ワード
参照先:https://blog.csdn.net/wh_19910525/article/details/8287202 http://landerlyoung.github.io/blog/2014/10/31/androidzhong-de-wakelockshi-yong/
一.使用
二.原理
簡単な本:https://www.jianshu.com/p/2cfd179ef8dc CSDN: https://blog.csdn.net/qq_32115439/article/details/8016922 GitHubブログ:http://lioil.win/2018/05/02/Android-WakeLock.html Codingブログ:http://c.lioil.win/2018/05/02/Android-WakeLock.html
一.使用
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyTAG");
wakeLock.acquire();
Manifest
WakeLock :
PARTIAL_WAKE_LOCK CPU ,
SCREEN_DIM_WAKE_LOCK CPU , ( ),
SCREEN_BRIGHT_WAKE_LOCK CPU ,
FULL_WAKE_LOCK CPU , ( )
ACQUIRE_CAUSES_WAKEUP ,
ON_AFTER_RELEASE , ( , )
PROXIMITY_SCREEN_OFF_WAKE_LOCK , , ( ), API API21 , hide
WakeLock , ( Activity view , ):
Activity.onCreate() : getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
xml : android:keepScreenOn="true"
View : view.setKeepScreenOn(true);
FLAG_KEEP_SCREEN_ON SCREEN_BRIGHT_WAKE_LOCK WakeLock
, , adb
FLAG:
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
( "android.permission.DISABLE_KEYGUARD")
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("unLock");
keyguardLock.reenableKeyguard(); //
//keyguardLock.disableKeyguard();//
! :
partial wakelock, Power , Sleep
wakelocks, Power , Sleep
PowerManager
boolean isScreenOn() , API20 , isInteractive()
void goToSleep(long time) ( APP "android.permission.DEVICE_POWER", )
void wakeUp(long time) ( , )
void reboot(String reason) ( APP "android.permission.REBOOT"), :"recovery","fastboot"
WakeLock :
void acquire() WakeLock, , ( ,APP , )
void acquire(long timeOut) timeOut WakeLock
void release() WakeLock
boolean isHeld() WakeLock
void setReferenceCounted(boolean value) ( ture): WakeLock acquire() , release() ,
acquire() , : java.lang.RuntimeException: WakeLock under-locked MyTAG
二.原理
adb WakeLock :
adb shell dumpsys power
Wake Locks: size=4
mLock:346803 PARTIAL_WAKE_LOCK 'MyTAG' ACQ=-1s175ms (uid=10201 pid=3862)
mLock:141928 SCREEN_DIM_WAKE_LOCK 'MyTAG' ACQ=-1s174ms (uid=10201 pid=3862)
mLock:402427 SCREEN_BRIGHT_WAKE_LOCK 'MyTAG' ACQ=-1s173ms (uid=10201 pid=3862)
mLock:124789 SCREEN_BRIGHT_WAKE_LOCK 'WindowManager' ON_AFTER_RELEASE ACQ=-1s70ms (uid=1000 pid=1196 ws=WorkSource{10201})
: Lock FLAG_KEEP_SCREEN_ON , (uid=1000 )
PowerManager.WakeLock , , , 。
setReferenceCounted(boolean value) , 。
, acquire() , release() 。
( --count == 0 ) , (count == 0) 。
PowerManager.WakeLock / ,
/ , 。
Wakelock :
1). /frameworks/base/core/java/android/os/PowerManager.java
WakeLock.acquire() -> PowerManagerService.acquireWakeLock()
2).frameworks /frameworks/base/services/java/com/android/server/PowerManagerService.java
APP wakelock, 、 、camera
static final String PARTIAL_NAME ="PowerManagerService";
public static native void nativeAcquireWakeLock(int lock, String id);
nativeAcquireWakeLock(PARTIAL_WAKE_LOCK_ID, PARTIAL_NAME);
3).JNI /frameworks/base/core/jni/android_os_Power.cpp
static void acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj){
...
const char *id = env->GetStringUTFChars(idObj, NULL);
acquire_wake_lock(lock, id);
env->ReleaseStringUTFChars(idObj, id);
}
4).kernel /hardware/libhardware_legacy/power/power.c
int acquire_wake_lock(int lock, const char* id){
...
return write(fd, id, strlen(id));
}
fd : "/sys/power/wake_lock"
id frameworks : "PowerManagerService"
簡単な本:https://www.jianshu.com/p/2cfd179ef8dc CSDN: https://blog.csdn.net/qq_32115439/article/details/8016922 GitHubブログ:http://lioil.win/2018/05/02/Android-WakeLock.html Codingブログ:http://c.lioil.win/2018/05/02/Android-WakeLock.html