Android基础入门教程——10.6 PowerManager(电源服务)

转载 2015年11月19日 14:08:06

1.PowerManager是什么


Android系统为我们提供的电源管理的一个API,其相关接口与设备电池的续航能力有很大的关联, 
官方也说了,除非是迫不得已吧,不然的话,应该尽量避免使用这个类,并且使用完以后一定要及时释放! 
所谓的电源管理包括:CPU运行,键盘或者屏幕亮起来!核心其实就是wakelock锁机制,只要我们拿着这个锁, 
那么系统就无法进入休眠状态,可以给用户态程序或内核获取到!锁可以是:”有超时的“或者 
没有超时“,超时的锁到时间后会自动解锁,如果没有了锁或超时,内核会启动休眠机制来进入休眠!


2.wakelock锁介绍


PowerManager.WakeLock加锁解锁两种状态,而加锁的形式有两种: 
永久锁住,这种锁除非显式的放开,否则是不会解锁的,所以用起来需要非常小心! 
超时锁,到时间后就会解锁,而创建WakeLock后,有两种加锁机制
①不计数锁机制②计数锁机制(默认) 
可通过setReferenceCounted(boolean value)来指定,区别在于: 
前者无论acquire( )多少次,一次release( )就可以解开锁。 
而后者则需要(–count == 0)的时候,同样当(count == 0)才会去申请锁 
所以,WakeLock的计数机制并不是正真意义上对每次请求进行申请/释放一个锁; 
只是对同一把锁被申请/释放的次数来进行统计,然后再去操作!

ps:关于更加深入的内容就涉及到底层的内容了,笔者水平有限,还没到那个level, 
这里就不深入研究了,就说一些基本的吧,以后有需要的话,再另开一篇吧~


3.PowerManager怎么用


<code class="language-Java hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">PowerManager pm = (PowerManager) getSystemService(Context<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.POWER</span>_SERVICE)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
PowerManager<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WakeLock</span> w1 = pm<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.newWakeLock</span>(PowerManager<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.SCREEN</span>_DIM_WAKE_LOCK, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"MyTag"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
w1<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.acquire</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
//在这个过程,屏幕会保持光亮!
w1<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.release</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

上述newWakeLock( )的第一个flag标记,这些标记不同程度的影响系统电源. 
这些标记都是独占的,并且每次只能指定其中一个。 
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。 
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯 
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度

ps:如果你使用的是局部唤醒锁的话(使用PARTIAL_WAKE_LOCK标志),CPU会继续运行, 
将忽略任何的计时器,甚至按下电源按钮。其他的唤醒锁话,CPU也会继续运转,但是使用者仍 
然可以按电源按钮让设备睡眠。另外,你可以使用两个以上的标记,但是他只影响屏幕的行为。 
和 PARTIAL_WAKE_LOCK 同时使用的话,没有任何影响。

屏幕解锁参数:

ACQUIRE_CAUSES_WAKEUP:正常唤醒锁实际上并不打开照明。相反,一旦打开他们会一直仍然 
保持(例如来世user的activity)。当获得wakelock,这个标志会使屏幕或/和键盘立即打开。 
一个典型的使用就是可以立即看到那些对用户重要的通知。 
ON_AFTER_RELEASE:设置了这个标志,当wakelock释放时用户activity计时器会被重置,导致照明 
持续一段时间。如果你在wacklock条件中循环,这个可以用来降低闪烁


4.需要的权限


要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限:

<code class="language-XML hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.WAKE_LOCK"</span>/></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

你可能还需要:

<code class="language-XML hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.DEVICE_POWER"</span>/></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

另外WakeLock的设置是Activity级别的,而不是针对整个Application应用的!

相关文章推荐

Android基础入门教程——10.6 PowerManager(电源服务)

本节要讲解的是Android为我们提供的系统服务中的——PowerManager(电源服务),用于 管理CPU运行,键盘或屏幕亮起来;不过,除非迫不得已,否则进来别去使用这个类,假如 你使用以后,...

Android基础入门教程——10.7 WindowManager(窗口管理服务)

1.WindowManager的一些概念: 1)WindowManager介绍 Android为我们提供的用于与窗口管理器进行交互的一个API!我们都知道App的界面都是  由一个个...

Android基础入门教程——10.5 AlarmManager(闹钟服务)

本节带来的Android中的AlarmManager(闹钟服务),听名字我们知道可以通过它开发手机闹钟类的APP, 而在文档中的解释是:在特定的时刻为我们广播一个指定的Intent,简单说就是我们自...

Android基础入门教程——10.8 LayoutInflater(布局服务)

本节继续带来的是Android系统服务中的LayoutInflater(布局服务),说到布局,大家第一时间 可能想起的是写完一个布局的xml,然后调用Activity的setContentView(...

Android入门进阶教程(19)-PowerManager 与电源管理

PowerManager这个类主要是用来控制电源状态的. 通过使用该类提供的api可以控制电池的待机时间,一般情况下不要使用。如果确实需要使用,那么尽可能的使用最低级别的WakeLocks锁。并且确保...

Android基础入门教程——2.5.4 其他几种常用对话框基本使用

上节我们对Dialog的父类:AlertDialog进行了学习,而本节我们来学习下几个常用的 Dialog的基本使用,他们分别是:ProgressDialog(进度条对话框),DatePickerD...

Android基础入门教程——8.3.1 三个绘图工具类详解

Android基础入门教程——8.3.1 三个绘图工具类详解标签(空格分隔): Android基础入门教程本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我...

Android基础入门教程——10.9 WallpaperManager(壁纸管理器)

本节给大家带来的是WallpaperManager(壁纸管理器),如其名,就是手机壁纸相关的 一个API,在本节中我们会描述下WallpaperManager的基本用法,调用系统自带的 壁纸选择功...

Android基础入门教程——3.5 监听EditText的内容变化

Android基础入门教程——3.5 监听EditText的内容变化 本节引言: 1.监听EditText的内容变化 2.实现EditText的密码可见与不可见 本节小结:

Android基础入门教程——2.3.7 ProgressBar(进度条)

Android基础入门教程——2.3.7 ProgressBar(进度条) 本节引言: 1.常用属性讲解与基础实例 2.使用动画来替代圆形进度条 3.自定义圆形进度条 本节小结:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)