Android笔记:Wake Lock

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

/**
 * Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,
 * 可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的,
 * 超时的锁会在时间过去以后自动解锁. 如果没有锁了或者超时了, 内核就
 * 会启动休眠的那套机制来进入休眠.
 * 
 * 一、关于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时将没有效果。
 * 
 * 二、权限获取 要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。 
 * <uses-permission android:name="android.permission.WAKE_LOCK" /> 
 * 你可能还需要 
 * <uses-permission android:name="android.permission.DEVICE_POWER" />
 * 
 * 三、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;
		}
	}
}
时间: 2024-10-09 05:35:09

Android笔记:Wake Lock的相关文章

Android 使用Wake Lock

为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU.WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态. WakeLock可以用来保持CPU运行,避免屏幕变暗和关闭,以及避免键盘背光灯熄灭. 注意: 创建和使用Wake Lock会对应用程序造成的电池电量消耗产生显著的影响.因此,最好只在 确实有必要时使用Wake Lock,并且使用它们的时间越少越好,只要有可 能就释放它们. 屏幕Wake Lock通常用于在用户观

Android笔记之 开机自启动

在项目中用到开机自动运行功能,因此学习了下,在此作为笔记记录下. 主要是以下4个步骤: 1.原理了解: 通过搜查资料发现,当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED,因此我们只需要在自己的应用中接收这个广播,然后启动APP即可. 2.编写接收器 既然是接收广播,必然是要用广播接收器,因此新建一个继承自广播BroadcastReceiver的类来专门接收上

android笔记1——开发环境的搭建

Long Long ago...已经成为了历史,我还是要说出一个真相:早年前,那时候,android还不被大众所认知的时候,当然开发者也没不像现在那样趋于饱和状态.一位大牛前辈,也是我的学长,那时候我还在上大学.前辈告诫我有时间得去看看android开发,那时候的自己,年轻.冲动.不畏惧,毅然地选择了java服务端开发,放弃了学习android开发. 时隔数年的今天,因为公司业务项目的发展,我还是得去做android开发工作...虽然这几年间断断续续的看了些android开发,但是将成为历史的今

Android笔记之日期选择器

1.主代码 /** * 日期选择器 */ private DatePickerDialog datePickerDialog; /** * 年 */ private int mYear=1993; /** * 月 */ private int mMonth=12-1; /** * 日 */ private int mDay=16; ......................... //构造函数包括mYear, mMonth, mDay用来显示初始日期,同时设置监听 datePickerDial

Android笔记之标题栏的各种操作

1.改变标题栏的背景颜色 this.setTitleColor(textColor); 2.为页面设置返回键 ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); ... @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (ite

Android笔记之 Web Service 基础

一.Web Service是什么? 就是网络服务,根据W3C的定义,WebServices(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一种自包含.自描述和模块化的应用程序,它可以在网络中被描述.发布和调用,可以将它看作是基于网络的.分布式的模块化组件.  Web Services是建立在通用协议的基础之上的,包括HTTP.SOAP.UDDI.WSDL等.其中Web Service三要素就是SOAP.WSDL和UDDI. SOAP用来描述传递信息的格式, WSDL用来描述如何访

Android笔记 之 旋转木马的音乐效果

一.前言-- 大家一定在百度音乐上在线听过歌,有没有注意到那个旋转唱片-- 就上面那个,当音乐在播放的时候,那个光碟轮子在转,就想旋转木马一般.感觉好好玩啊. 碰巧想起前阵子做音乐播放器,哎,那这个也可以做在手机的音乐播放器上,这样就代替了进度条了. 一想到,就兴奋,于是,首先画圆形,然后放置背景图片,然后使用动画旋转.当音乐播放时,同时 开始播放圆形图片的动画,当音乐暂停时,暂停旋转:当音乐停止播放时,就停止动画,图片回到原点. 二.效果-- 三.源码-- (1)MainActivity <s

Android笔记:获取url或uri字符串中的参数值

d Uri.parse(mArgUrl).getQueryParameter("id") Android笔记:获取url或uri字符串中的参数值

Android笔记:SurfaceView与SurfaceHolder对象

摘要 调试Media播放时,不时用到SurfaceView与SurfaceHolder对象,写case测试及实际运行效果, 基本上搞清楚这两个对象的用法及区别 1.SurfaceView public class SurfaceView extends View SurfaceView是视图(View)的继承类, 这个视图里内嵌了一个专门用于绘制 调试Media播放时,不时用到SurfaceView与SurfaceHolder对象,写case测试及实际运行效果, 基本上搞清楚这两个对象的用法及区