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效能優化篇之服務優化Android優化
- 初體驗之開源Git服務GogsGitGo
- Android四大元件之服務————服務的生命週期和啟動方式Android元件
- Android入門教程 | 四大元件之Service(前臺服務,後臺服務)Android元件
- Nginx服務系列——靜態資源web服務NginxWeb
- 服務與服務之間的呼叫
- Android自動化無障礙服務開源庫-Assists v3.0.0Android
- 高效管理 Android 前臺服務Android
- android模擬器無服務Android
- Android硬體服務框架例項之Vibrator(驅動到應用)Android框架
- VMware Data Services Manager 2.1 - 資料庫管理和資料服務管理資料庫
- SpringCloud之服務呼叫SpringGCCloud
- apollo之ConfigService服務Gse
- linux之nfs服務LinuxNFS
- linux之lsync服務Linux
- 博士資源服務聯盟
- 微服務之Eureka服務發現微服務
- Redis服務之Redis ClusterRedis
- SpringCloud之服務註冊SpringGCCloud
- 患者管理之服務包
- Android內容服務ContentService原理淺析Android
- 7 Android中常用的系統服務Android
- (轉)開源的任務佇列服務HTQ佇列
- 架構之:微服務和單體服務之爭架構微服務
- 微服務架構之「 服務註冊 」微服務架構
- 《吃透微服務》 - 服務容錯之Sentinel微服務
- 開源計劃之--Android繪相簿--LogicCanvasAndroidCanvas
- Docker和containerd服務配置國內源DockerAI
- Dubbo原始碼之服務引用原始碼
- 服務與資料之爭
- eureka服務之間呼叫(3)
- Linux之郵件mail服務LinuxAI
- 服務治理之重試篇
- Redis服務之常用配置(三)Redis
- Redis服務之常用配置(二)Redis
- Redis服務之常用配置(一)Redis
- WEB服務-Nginx之十-keepalivedWebNginx
- 記一次 .NET 某電商無貨源後端服務 死鎖分析後端