Android 耗電統(tǒng)計的顯示

原因

公司的項目要過移動測試,需要提供類似手機管家的應用。所以需要把省電管理這塊加進去,另外要按照硬件和軟件分別顯示耗電的排行。

工作量

由于不在直接在Setting里面改動。那么單獨在APP中要把setting中電池里面的排行移植過來。Setting中顯示這些信息的地方在PowerUsageSummary.java中(繼承PreferenceFragment)。而在我們的app中不使用Preference需要使用ExpandableListView來分層顯示硬件和軟件的電量排行,所以主要的工作量是把電量統(tǒng)計相關的代碼移植過來。

主要涉及的類

  • BatteryStatsHelper -- 計算所有應用的耗電(A helper class for retrieving the power usage information for all applications and services.)
  • PowerProfile -- 實際是從xml(power_profile.xml)中讀出里各個硬件cpu,屏幕藍牙wifi之類的耗電基值(記錄每種硬件1秒鐘耗多少電)。這樣,根據(jù)各個應用的運行時間就可以算出耗電了。(Reports power consumption values for various device activities. Reads values from an XML file.)
  • BatterySipper -- 具體的uid對應的電量消耗(Contains power usage of an application, system service, or hardware type)
  • BatteryStats(abstract) 實際用的是BatteryStatsImpl(providing access to battery usage statistics, including information on wakelocks, processes, packages, and services.)
  • BatteryEntry -- 對應的包名和icon,作為UI的數(shù)據(jù)來源。(Wraps the power usage data of a BatterySipper with information about package name and icon image)

刷新流程 -- PowerUsageSummary中refreshStats函數(shù)

  1. 首先,調(diào)用mStatsHelper.refreshStats()來刷新當前的電量統(tǒng)計
  2. 然后mStatsHelper.getUsageList()返回BatterySipper的數(shù)組,每個BatterySipper代表一個應用(uid)的消耗的電量信息
  3. 根據(jù)BatterySipper的信息生成BatteryEntry產(chǎn)生數(shù)據(jù),剩下的就是怎么根據(jù)BatteryEntry來顯示了。

總結

基本上把上面的邏輯拿出來,放到app中,ExpandableListView配合BaseExpandableListAdapter來完成顯示。所以難度不大,是搬磚的活。但是背后的framework中battery相關類和service確實很復雜。看出來谷歌在電量統(tǒng)計上還是做了不少工作。算是有個大概了解了。有機會自己分析一下framework中是怎么統(tǒng)計電量了。
網(wǎng)上搜了幾篇不錯的文章,如下:
Android BatteryStatsHelper深入理解(and5.1)
Android應用的耗電量統(tǒng)計

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容