android 電源管理 wakelock 喚醒鎖機制

Android 電源管理 — 喚醒鎖全新上市

大多數人可能都遭遇過手機的電池續航時間較短帶來的尷尬。 這極其令人討厭。 沒電的手機和一塊水泥磚沒什么差別。 一般而言,如果用戶的手機電池無法持續一整天,他們會感到非常不滿。而且,當手機充電時用戶無法使用手機,這同樣會帶來極大的不便。

傳統上需要使用筆記本電腦或 PC 處理的任務,現在借助全新的改進軟件,即使未在桌旁也可使用智能手機進行處理。 但是相比筆記本電腦,智能手機的小外形很大地限制了可容納的電池尺寸。 既要求手機具備筆記本電腦的功能,同時又要求其具備全天候的電池續航能力是難以實現的。

通過采用出色的電源管 理,Android 和其他移動操作系統實現了耐久的電池續航時間。 停止使用手機后不久,顯示器便會關閉,CPU 會進入深度節能狀態,因此在不使用它時僅會消耗極少的電源。 這就是電話在使用時充一次電便能持續使用多日的原因。 借助 Android 的電源管理器,正常計劃是顯示器關閉時 CPU 也關閉。

但是,Android 開發人員能夠(并有權限)阻止 Android 設備進入睡眠模式。 他們可能希望讓 CPU 處于活動狀態 — 即使顯示器關閉。 或者可能他們希望在執行某項活動時阻止顯示器自動關閉。 出于此原因,Google* 在其 PowerManager API 中增加了喚醒鎖。 阻止設備進入睡眠模式的應用可以使用喚醒鎖。 只要系統上有活動的喚醒鎖,設備便無法進入掛起模式,除非釋放喚醒鎖。 使用喚醒鎖時,一定要了解到當您不需要喚醒鎖時,必須將其正確釋放,因為未釋放的喚醒鎖無法進入默認狀態以節能,從而很快便會將設備的電池耗盡。

本文將會為您介紹一些在 Android 4.0 中默認使用喚醒鎖的 Android 應用(和使用模式),以便幫助您了解何時使用此項技術。 然后,將會介紹一個 SDPSamples 集中的示例應用“Wakelocks”,以展示如何編寫喚醒鎖的代碼。

喚醒鎖應用使用情況

借助 Android, 有一種方法可以查看哪些服務啟用了喚醒鎖,阻止系統進入低功耗狀態。 設備上的 /proc/wakelocks 文件列出了定義使用喚醒鎖的服務和驅動程序。 通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以了解 CPU 資源何時啟用了喚醒鎖,以及哪種服務啟用了 wakelock2。 我捕獲了幾種使用案例,其中運行 Android 4.0 的 Galaxy Nexus 上啟用了喚醒鎖,如下所示:

使用的應用執行的操作使用了喚醒鎖的服務運行狀況
任意按下 UI Widget(如點擊按鈕或 ListView 項)PowerManagerService啟用并在 5 秒鐘后釋放鎖定
地圖/導航啟用地圖或進入導航gps-lock啟用鎖定并使用 GPS
YouTube觀看流視頻PowerManagerService在視頻播放的整個過程中一直啟用喚醒鎖
Music聽音樂PowerManagerService在音樂播放的過程中一直啟用喚醒鎖

表格:一些默認的 Android 應用演示喚醒鎖的使用

YouTube 和 Music 應用能夠很好地展示不同級別的喚醒鎖。 用戶播放視頻時,YouTube 應用將會啟用喚醒鎖。 在播放視頻的整個過程中,顯示器會保持開啟狀態(忽略系統的顯示設置)。 但是,如果用戶在播放過程中按下了電源按鈕,設備將會掛起,這會導致顯示器關閉以及音頻/視頻停止播放。 Music 應用在播放音頻時使用不同的喚醒鎖。 顯示設置無法更改,因此設備的屏幕將會根據用戶的顯示設置來關閉。 顯示器關閉后,喚醒鎖會讓 CPU 保持活動狀態以便音頻能夠繼續播放 — 即使用戶按下了電源按鈕。

選擇喚醒鎖(在執行前)

在了解如何編寫喚醒鎖之前,一定要了解喚醒鎖的種類,以便為您的應用挑選最適合的喚醒鎖。 Android PowerManager API 介紹了多種用于更改設備電源狀態的喚醒鎖標記:

標記值CPU屏幕鍵盤
PARTIAL_WAKE_LOCK開啟關閉關閉
SCREEN_DIM_WAKE_LOCK開啟調暗(Dim)關閉
SCREEN_BRIGHT_WAKE_LOCK開啟調亮(Bright)關閉
FULL_WAKE_LOCK開啟調亮(Bright)調亮(Bright)

表格:?源自 Android PowerManager API。

該 API 突出強調了喚醒鎖會顯著縮短 Android 設備的電池續航時間,因此如果可以避免應盡量減少使用它們。 如果使用,也應盡快將其釋放。

使用喚醒鎖的應用必須申請特別 許可才可執行。 這可通過應用清單文件中的 android.permission.WAKE_LOCK 許可來實現。 也就是說,當用戶通過 Google Play 安裝使用喚醒鎖的應用時,系統會提醒他們該應用包含的特性可能會“Prevent phone from sleeping(阻止手機進入睡眠狀態)”。 如果開發人員希望阻止某個應用的顯示器在特定使用情況下變暗,可采用 Google 另外提供的一種方法,這種方法無需特別許可。 WindowManager 包括一個 FLAG_KEEP_SCREEN_ON 變量,當應用的視圖要阻止界面關閉時可對其進行設置。 建議在顯示控制上使用這種方法,因為其影響在應用內相互獨立。 用戶任務切換到其他應用上之后,WindowManager 將會立刻釋放喚醒鎖。

讓顯示器保持開啟狀態(源自 SDPSamples)

SDPSamples 集的喚醒鎖應用演示了(包括代碼)應用如何使用 Window Manager 而非通過編寫喚醒鎖代碼讓顯示器保持開啟狀態。 啟用喚醒鎖應用后,選擇“Win Man Screen On”列表項。

只要按鈕的狀態顯示“Screen is LOCKED”,界面就會保持開啟狀態。 按鈕的狀態更改為“Screen is UNLOCKED”后,如果超過 5 秒鐘不操作,顯示器將會關閉。

在代碼中,每次按下按鈕且狀態發生改變時,通過設置和釋放當前窗口的 FLAG_KEEP_SCREEN_ON 變量可在 WakeLockActivity.java 中使用 screenLockUpdateState() 函數實現該操作。

public void screenLockUpdateState() {if (mIsDisplayLocked){...// update display stategetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);} else 
{...// update display stategetWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);}
} 

編寫喚醒鎖(來自 SDPSamples)

SDPSamples 集中的喚醒鎖應用還包括執行不同喚醒鎖的代碼。 啟動喚醒鎖應用后,從下列四種喚醒鎖中選擇: Power Wake Lock Full、Power Wake Lock Bright、Power Wake Lock Dim 和 Power Wake Lock Partial。 這 4 個列表項對應著 PowerManager API 中介紹的 4 種喚醒鎖標記。 每一項將會分別演示 5 秒內嘗試關閉屏幕時設備如何響應。

通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以看到按下電源按鈕后 PARTIAL_WAKE_LOCK 是唯一仍然有效的喚醒鎖。 其他的喚醒鎖通過多種級別的亮度阻止顯示器關閉。

編寫喚醒鎖的第一步是申請許可,之后才可使用清單 AndroidManifest.xml 內的喚醒鎖:

這一步完成后,便可以創建喚醒鎖對象,包括控制喚醒鎖的獲取()函數和釋放()函數。 WakeLockActivity.java 文件內的編碼很好地展示了該情況:

public void onCreate(Bundle savedInstanceState) {...mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);...mWakeLock = mPowerManager.newWakeLock(mWakeLockState,"UMSE PowerTest");if (mWakeLock != null) {mWakeLock.acquire();...	}
}protected void onDestroy() {if (mWakeLock != null) {mWakeLock.release();mWakeLock = null;}...	
}

結論

喚醒鎖是 Android 中一款強大的概念,可支持開發人員修改設備的默認電源狀態。 在應用中使用喚醒鎖的風險:它會減少設備的電池續航時間。 使用喚醒鎖的明顯優點可在 Google 提供的多種默認應用中看得到,如道路導航和音樂/視頻播放。 因此,開發人員應自行確定他們的應用模型能否從使用喚醒鎖中得益。

轉載于:https://www.cnblogs.com/jasonxcj/p/4994343.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286532.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初始Bootstrap

使用示例①下載Bootstrap框架 網址:http://v3.bootcss.com/getting-started/#download②解壓得到三個文件③將文件添加進項目后,在頁面中引用必要的css和js④查看效果(a標簽美化得不要不要的了~)更多學習Bootstrap的資…

APP無埋點流程

最近無埋點技術很是流行,抽空研究了下諸葛IO,talkingData以及百分點這些業內知名公司的無埋點SDK,抽取其中重要的信息供大家參考:1、首先什么是無埋點呢,其實所謂無埋點就是開發者無需再對追蹤點進行埋碼,而…

Esri Maps For Office制作漂亮的地圖

ArcGISOnline是一個基于云架構的資源中心,在這里你可以發布自己的地圖資源、瀏覽其它ArcGIS愛好者發布的應用程序;總之,它為我們提供了一個在線交流的場所。 EsriMapsForOffice是ArcGISonline推出的一個Office環境的插件,可以讓我們在Excel、Powerpoint中進行制圖,就像在…

《什么是 eBPF》O'Reilly 報告中文版放送

祝大家端午安康,國泰民安,世界和平。今年端午節,鄙人人在北京,所在區有中風險地區,而老家又是所在省的唯一一個中風險地區,既出不了京,也回不了家。可謂有家不能回,真是每逢佳節倍思…

介紹一個代碼管理系統-Git

Git是一個跨平臺的代碼管理系統,據說比SVN好很多,呵呵!! http://git.or.cz/ 一個基于Git管理的代碼共享網站 http://github.com/ 在windows下的客戶端程序(msysgit):http://code.google.com/p/msysgit/ 還沒有圖形客戶…

優秀博客鏈接(linux c/c++ java go php android ios 前端 j2ee windows linux 算法 ACM 深度/機器學習 AI opencv nlp)

pudn阿甘兄 前端 服務端 底層 移動端 大數據 云計算 AI 培訓機構的課程差不多就這一套了 大數據 AI NLP 高等數學 LeetCode、《數據結構與算法之美》學習筆記、AI前端資料學習,vue.js react.js flutterleetCode刷完的神機器學習數據挖掘基礎Linux c/c大神 目前cs…

一鍵將Python2代碼自動轉化為Python3

Python2的代碼直接在Python3環境運行的話會報錯誤: 如果大量的代碼,無論是批量替換,還是逐行修改都夠累的,這活兒表示不能干!!! 有沒有辦法一鍵轉換呢? 百度了一下發現網上的方法如…

【前端就業課 第一階段】HTML5 零基礎到實戰(十)JavaScript基礎一篇入門

注意:手機(APP)打開,內容顯示更佳,不會的私聊博主即可 想要拿代碼或加入學習計劃(** 博主會監督你并且教你寫文章 **)的拉到最下面(PC端Web打開)加博主即可,目…

推理集 —— 實證

現實世界的諸多事就像物理定律,而不是數學定理,也即不保證絕對正確,而需要不斷地驗證,實證。 不能不經實證就輕言一件事是行還是不行,尤其在事情如果實證的成本較低,比如今天圖書館是不是開門,路…

一款開源的跨平臺實時web應用框架——DotNetify

今天給大家介紹一個開源的輕量級跨平臺實時HTMLC#.NET Web應用程序開發框架——DotNetify,允許你在C#.NET后端上創建具有React、React Native、Vue或Blazor 前端的實時、響應式、跨平臺應用程序。它的主要特點是:簡單且輕量響應式后端MVVM內置實時解決方…

【GeoDataBase】Geodatabase智能化操作:屬性域

Geodatabase中所包含的不僅僅是要素類、要素集和表,還可能包含關系類、注釋類、幾何網絡、拓撲等不同的結構和類別。 地理數據庫按照面向對象的模型存儲地理信息,也可以將其非空間信息保存在表中。對于要素和表可以設置一些規則進行限制,對屬性的約束稱為屬性域。 屬性域是描…

Android之All children of ConstraintLayout must have ids to use ConstraintSet

1 問題 Fatal Exception: java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSetat androidx.constraintlayout.widget.ConstraintSet.readFallback(ConstraintSet.java:459)at androidx.constraintlayout.motion.widget.MotionS…

Lua性能優化

規則1:不要優化。 規則2:仍然不要優化(專家除外) 當用Lua編程時,這兩條規則顯得尤為重要。Lua以性能著稱,而且在腳本語言中也因此而值得贊美。 然而,我們都知道性能是編程的一個關鍵因素。具有復…

常用的LINQ to SQL 用法

一、Where操作 適用場景:實現過濾,查詢等功能。 說明:與SQL命令中的Where作用相似,都是起到范圍限定也就是過濾作用的,而判斷條件就是它后面所接的子句。 Where操作包括3種形式,分別為簡單形式、關系條件形…

用Python寫一個將Python2代碼轉換成Python3代碼的批處理工具

之前寫過一篇如何在windows操作系統上給.py文件添加一個快速處理的右鍵功能的文章:《一鍵將Python2代碼自動轉化為Python3》,作用就是為了將Python2的文件升級轉換成Python3的文件。之后,有朋友問,如果有很多文件需要轉換&#xf…

WP 手機Lumia 820 鎖屏密碼的POJI研究

Windows Phone lumia 手機鎖屏密碼的POJI研究大家好今天給大家分享一個最新研究案例,近日筆者Nokia Lumia 820,由于客戶密碼失誤太多,導致鎖屏23000余分鐘,,請看:型號Nokia Lumia820條件:Lumia8…

ArcGIS10從入門到精通系列實驗圖文教程(附配套實驗數據持續更新)

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 本教程《ArcGIS從入門到精通系列實驗教程》內容包括:ArcGIS平臺簡介、ArcGIS應用基礎、空間數據的采集與組織、空間數據的轉換與處理、空間數據的可視化表達、GIS空間分析導論、矢量數據的空間分析、柵格數據…

【iVX 初級工程師培訓教程 10篇文拿證】09 聊天室制作

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

為什么Dapr是比SpringCloud和Istio更優雅的微服務框架?

作者:徐磊文章首發地址:https://smartide.cn/zh/blog/2022-0601-dapr/Dapr 是微軟主導的云原生開源項目,2019年10月首次發布,到正式發布 V1.0 版本的不到一年的時間內,github star 數達到了 1.2萬(現在已經…

Android之模擬網絡請求返回http 502、400、401、402錯誤碼

1 問題 app 網絡框架協程沒有做網絡異常捕獲處理,想本地測試網絡接口,希望網絡接口返回Http的錯誤碼 比如502、400、401、402 2 解決辦法 1、pc安裝Fiddler Everywhere 2、讓Fiddler Everywhere支持抓http和https的包 3、保持手機和電腦同一個局域網&am…