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/
一.使用
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