Android笔记:Wake Lock

import android.app.Service;
import android.content.Context;
import android.os.PowerManager;

/**
 * Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就没法进入休眠,
 * 能够被用户态程序和内核得到. 这个锁能够是有超时的或者是没有超时的,
 * 超时的锁会在时间过去之后自动解锁. 若是没有锁了或者超时了, 内核就
 * 会启动休眠的那套机制来进入休眠.
 * 
 * 1、关于int flags 各类锁的类型对CPU 、屏幕、键盘的影响: 
 * 1.PARTIAL_WAKE_LOCK:保持CPU运转,屏幕和键盘灯有多是关闭的。 
 * 2.SCREEN_DIM_WAKE_LOCK:保持CPU 运转,容许保持屏幕显示但有多是灰的,容许关闭键盘灯
 * 3.SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,容许保持屏幕高亮显示,容许关闭键盘灯 
 * 4.FULL_WAKE_LOCK:保持CPU运转,保持屏幕高亮显示,键盘灯也保持亮度 
 * 5.ACQUIRE_CAUSES_WAKEUP:Normal wake locks don't
 * actually turn on the illumination. Instead, they cause the illumination to
 * remain on once it turns on (e.g. from user activity). This flag will force
 * the screen and/or keyboard to turn on immediately, when the WakeLock is
 * acquired. A typical use would be for notifications which are important for
 * the user to see immediately. 
 * 6.ON_AFTER_RELEASE:f this flag is set, the user
 * activity timer will be reset when the WakeLock is released, causing the
 * illumination to remain on a bit longer. This can be used to reduce flicker if
 * you are cycling between wake lock conditions.
 * 
 * 你能加两个以上的标志,这些仅能影响屏幕的行为。这些标志当组合中有一个PARTIAL_WAKE_LOCK时将没有效果。
 * 
 * 2、权限获取 要进行电源的操做须要在AndroidManifest.xml中声明该应用有设置电源管理的权限。 
 * <uses-permission android:name="android.permission.WAKE_LOCK" /> 
 * 你可能还须要 
 * <uses-permission android:name="android.permission.DEVICE_POWER" />
 * 
 * 3、WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。
 * 
 **/

abstract class WakeLockService extends Service
{
    private android.os.PowerManager.WakeLock mWakeLock;
    
    WakeLockService()
    {
    }
    
    /**
     * 获取锁,保持屏幕亮度。 Android中经过各类Lock锁对电源进行控制,须要注意的是加锁和解锁必须成对出现。
     * 通常使用:这个函数在Activity的 onResume中被调用。releaseWakeLock()方法则是释放该锁,在Activity的onPause中被调用。
     */
    protected void acquireWakeLock()
    {
        if (mWakeLock == null)
        {
            //经过PowerManager的newWakeLock((int flags, String tag)方法来生成WakeLock实例。 
            //int Flags指示要获取哪一种WakeLock,不一样的Lock对cpu、屏幕、键盘灯有不一样影响。
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getClass().getCanonicalName());
            mWakeLock.setReferenceCounted(false);
            mWakeLock.acquire();
        }
    }
    
    protected void acquireWakeLock(long timeout)
    {
        if (mWakeLock == null)
        {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getClass().getCanonicalName());
            mWakeLock.setReferenceCounted(false);
            mWakeLock.acquire(timeout);
        }
    }
    
    /**
     * 释放锁,显示的释放,若是申请的锁不释放系统就不会进入休眠。
     */
    protected void releaseWakeLock()
	{
		
		if(mWakeLock == null || !mWakeLock.isHeld())
		{
		    mWakeLock.release();
		    mWakeLock = null;
		}
	}
}
相关文章
相关标签/搜索