Android Manager之PowerManager(電源服務)
簡介:
Android系統為我們提供的電源管理的一個API,其相關介面與裝置電池的續航能力有很大的關聯, 官方也說了,除非是迫不得已吧,不然的話,應該儘量避免使用這個類,並且使用完以後一定要及時釋放。所謂的電源管理包括:CPU執行,鍵盤或者螢幕亮起來!核心其實就是wakelock鎖機制,只要我們拿著這個鎖, 那麼系統就無法進入休眠狀態,可以給使用者態程式或核心獲取到。鎖可以是:”有超時的“或者 “沒有超時“,超時的鎖到時間後會自動解鎖,如果沒有了鎖或超時,核心會啟動休眠機制來進入休眠。
PowerManager.WakeLock有加鎖與解鎖兩種狀態,而加鎖的形式有兩種:
①永久鎖住,這種鎖除非顯式的放開,否則是不會解鎖的,所以用起來需要非常小心。
②超時鎖,到時間後就會解鎖,而建立WakeLock後,有兩種加鎖機制:
①不計數鎖機制,②計數鎖機制(預設)
可通過setReferenceCounted(boolean value)來指定,區別在於:
前者無論acquire( )多少次,一次release( )就可以解開鎖。
而後者則需要(–count == 0)的時候,同樣當(count == 0)才會去申請鎖 所以,WakeLock的計數機制並不是正真意義上對每次請求進行申請/釋放一個鎖; 只是對同一把鎖被申請/釋放的次數來進行統計,然後再去操作!
android系統在手機螢幕鎖定之後一般會讓手機休眠,以提高電池的使用時間。但是休眠意味著CPU頻率降低,有時候可能需要做一些需要大量運算的任務,所以需要喚醒CPU。WakeLock可以做到這一點。也就是說WakeLock主要用於操作螢幕問題。
使用
1.新增許可權
<!-- 允許應用在手機螢幕關閉後後臺程式仍然執行 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER"/>
2.程式碼使用
2.1.獲取 WakeLock 物件
private PowerManager.WakeLock mWakeLock;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
2.2.WakeLock的等級
1.PARTIAL_WAKE_LOCK:保證CPU保持高效能執行,而螢幕和鍵盤背光(也可能是觸控按鍵的背光)關閉。一般情況下都會使用這個WakeLock。
2.ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高效能執行外還會導致螢幕亮起,即使螢幕原先處於關閉的狀態下。
3.ON_AFTER_RELEASE:如果釋放WakeLock的時候螢幕處於亮著的狀態,則在釋放WakeLock之後讓螢幕再保持亮一小會。如果釋放WakeLock的時候螢幕本身就沒亮,則不會有動作。
2.3.獲得WakeLock
mWakeLock.acquire();
2.4.釋放WakeLock
mWakeLock.release();
2.5.其他方法
boolean isHeld():
判斷是否已經獲取WakeLock
void setReferenceCounted(boolean value):
是否使用引用計數。類似於垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的話將啟用該特性,如果一個WakeLock acquire了多次也必須release多次才能釋放掉。但是如果釋放次數比acquire多則會丟擲RuntimeException("WakeLock under-locked " + mTag)異常。預設是開啟了引用計數的!
2.6.PowerManager的幾個實用方法
void PowerManager::goToSleep(long time)time是時間戳,一般是System.currentTimeMillis()+timeDelay。強制系統立刻休眠,需要Manifest中新增許可權"android.permission.DEVICE_POWER"。按下電源鍵鎖屏時呼叫的就是這個方法。
void PowerManager::wakeUp(long time)與上面對應。引數含義,所需許可權與上同。按下電源鍵解鎖螢幕時呼叫的就是這個方法。
void PowerManager::reboot(String reason)重啟手機,reason是要傳給linux核心的引數,比如“recovery”重啟進recovery模式,“fastboot”重啟進fastboot模式。需要許可權"android.permission.REBOOT"。
附:
Android Manager之彙總
相關文章
- Android 之 ServiceManager與服務管理Android
- 初體驗之開源Git服務GogsGitGo
- Android服務端開發之使用Eclipse搭建Java Web服務端Android服務端EclipseJavaWeb
- Android效能優化篇之服務優化Android優化
- Android電源管理Android
- Nginx服務系列——靜態資源web服務NginxWeb
- C# 之 服務端獲取遠端資源C#服務端
- Resource Manager資源管理之使用組切換分析
- Android四大元件之服務————服務的生命週期和啟動方式Android元件
- Android入門教程 | 四大元件之Service(前臺服務,後臺服務)Android元件
- oracle中國服務電話Oracle
- linux服務之NFS和SAMBA服務LinuxNFSSamba
- Android 使用前臺服務Android
- Android Service 服務(一)—— ServiceAndroid
- 微服務之Eureka服務發現微服務
- Laravel 服務之任務排程Laravel
- Oracle 資源管理(resource manager)Oracle
- VMware Data Services Manager 2.1 - 資料庫管理和資料服務管理資料庫
- Windows Service外掛服務開源Windows
- Redis服務之Redis ClusterRedis
- SpringCloud之服務呼叫SpringGCCloud
- 亞馬遜雲服務之CloudFormation亞馬遜CloudORM
- Location服務之Geocoder
- (轉)開源的任務佇列服務HTQ佇列
- Android自動化無障礙服務開源庫-Assists v3.0.0Android
- 微服務架構之「 服務註冊 」微服務架構
- 《吃透微服務》 - 服務容錯之Sentinel微服務
- 架構之:微服務和單體服務之爭架構微服務
- android模擬器無服務Android
- 高效管理 Android 前臺服務Android
- Android 啟動和停止服務Android
- Android Service 服務(二)—— BroadcastReceiverAndroidAST
- Android高手進階教程(十八)之---列出Android裝置中所有啟動的服務,及判斷某個服務是否開啟!Android
- Jmeter之Http Cookie ManagerJMeterHTTPCookie
- PowerManager 不是隻有 WakeLock | 掘金技術徵文
- 服務型企業的資源管理:助服務行業突破瓶頸!行業
- Redis服務之常用配置(三)Redis
- Redis服務之常用配置(一)Redis