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; } } }