Android 5.1 - 狀態欄充電標志問題

Android 5.1 Ubuntu14.04 ?SourceInsigh

電量已滿,插著USB頭,觀察Settings - Battery,電量為100%,狀態為full,但仍有充電圖標rust

之前有讀過關于StatusBar的代碼。這次直接用SourceInsight找到?StatusBarHeaderView.java??

里面關于電池的方法有

    @Override     public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {         String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);         mBatteryLevel.setText(percentage);     }

似乎沒什么幫助,我們找的是圖標,不是數字

猜測一下,電池狀態變化的時候,肯定會發出通知,十有八九是用廣播發出的

用SourceInsight直接搜索battery,搜到關于Battery的一些文件

/** BatteryManager.java (base/core/java/android/os)*/     // values for "status" field in the ACTION_BATTERY_CHANGED Intent     public static final int BATTERY_STATUS_FULL = 5;    // 定義了狀態值

在?BatteryService.java?中,可以發現一個獲取icon的方法

/** BatteryService.java (base/services/core/java/com/android/server) */ private int getIconLocked(int level) {         if (mBatteryProps.batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) {             return com.android.internal.R.drawable.stat_sys_battery_charge; ......

根據stat_sys_battery_charge,可以找到?Stat_sys_battery_charge.xml? (framework/base/core/res/res/drawable)

find一下就能值得圖標存放在frameworks/base/core/res/res/drawable-mdpi/ 等目錄下

?

修改?BatteryService.java? getIconLocked中的判斷條件或返回值

找到了很多資源文件,修改一下返回值。比如:

if (mBatteryProps.batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) {             return com.android.internal.R.drawable.stat_sys_battery;    // 顯示未充電的圖標

編譯后push進去,發現沒效果

不成功,為何?發出的廣播沒有人接收?icon被塞進了?BatteryManager.EXTRA_ICON_SMALL

int icon = getIconLocked(mBatteryProps.batteryLevel); intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon);

grep一下EXTRA_ICON_SMALL,發現沒地方接收。發出的廣播沒人收,那電池圖標rust是怎么放上去的?

?

換一個尋找思路

我知道狀態欄屬于SystemUI,觀察SystemUI的文件目錄;打開?AndroidManifest.xml?看到

<service android:name="SystemUIService" android:exported="true"/>

接下來找到并打開?SystemUIService.java?;在onCreate()中提到了SystemUIApplication

?SystemUIApplication.java?里啟動了一系列的服務,其中就包括

com.android.systemui.statusbar.SystemBars.class

打開?SystemBars.java? frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar

可以看到BaseStatusBar

?mStatusBar = (BaseStatusBar) cls.newInstance();?

順藤摸瓜

在?BaseStatusBar.java?中搜索R.layout,卻只找到notification相關的

BaseStatusBar是基礎狀態欄的意思,會不會有別的類來繼承它?grep一下發現

TvStatusBar和PhoneStatusBar繼承自BaseStatusBar

在?PhoneStatusBar.java?中搜索“R.layout.”,得到幾個layout:

R.layout.super_status_bar

R.layout.heads_up

R.layout.navigation_bar

R.layout.status_bar_notification_keyguard_overflow 等等

mStatusBarWindow = (StatusBarWindowView) View.inflate(context,                 R.layout.super_status_bar, null);

重點關注一下super_status_bar,里面裝載了很多子布局,比如status_bar

打開?status_bar.xml? ,找到system_icon_area;它include了system_icons

打開?system_icons.xml?我們發現,有一個自定義控件com.android.systemui.BatteryMeterView

現在知道電池圖標是畫出來的了

//BatteryMeterView.java (framework/base/packages/systemui/src/com/android/systemui) public class BatteryMeterView extends View implements DemoMode,         BatteryController.BatteryStateChangeCallback

實現了BatteryController.BatteryStateChangeCallback接口,電池狀態改變,電池圖標會更新

private class BatteryTracker extends BroadcastReceiver {

接收廣播,取出電池各項信息;得到電池信息要更新圖標

觀察draw方法,里面有用tracker來進行判斷

        if (tracker.plugged) {             // define the bolt shape

如果插上了USB頭,就畫出閃電標志;我們的要求是充電狀態下才能有閃電標志

那么多加入一個判斷,當充滿電的時候,不要畫閃電標志

        if (tracker.plugged && (batteryStatus != BatteryManager.BATTERY_STATUS_FULL)) {             // define the bolt shape

batteryStatus是rust自行定義的int變量,從BatteryTracker中取出電池status,再用來判斷

重新編譯燒寫,發現充滿電后,無充電標志

原來充電的標志rust是畫上去的。

轉載于:https://www.cnblogs.com/muhuacat/p/5613400.html

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

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

相關文章

kail中tools的安裝和第一個php學習筆記

安裝tools 打開 鼠標右擊選擇 創建文件夾 mkdir cdrom 把tools文件復制到 位置——計算機——cdrom文件夾下 打開 cdrom cd cdrom 復制生成的目錄 解壓文件夾&#xff1a;tar zxvf 粘貼目錄 回車 ls 復制目錄 cd 粘貼目錄 ls 復制后綴為pl的目錄 ./粘貼目錄.d自動下載 Enjoy代表…

面試進階題集錦-持續更新

面向對象的”六原則一法則” - 單一職責原則&#xff1a;一個類只做它該做的事情。&#xff08;單一職責原則想表達的就是”高內聚”&#xff0c;寫代碼最終極的原則只有六個字”高內聚、低耦合”&#xff0c;所謂的高內聚就是一個代碼模塊只完成一項功能&#xff0c;在面向對象…

透明(顏色)漸變背景(顏色透明背景),兼容IE8

filter: progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000); -ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000)";一般用filter就…

python pip本地安裝包_python-pip install 安裝包

python-pip install 安裝包國內安裝python包&#xff0c;有時會因為網絡問題&#xff0c;導致package安裝失敗&#xff0c;so,換一種方法解決&#xff1b;pip install package_name;(直接安裝&#xff1b;推薦使用&#xff0c;但因網絡問題&#xff0c;有時安裝失敗)pip instal…

【CDN】域名無法訪問,ping不到,tracert不到

背景&#xff1a;香港服務器&#xff0c;CDN服務商&#xff1a;Incapsula 1、首先猜測&#xff0c;域名是否被墻 原因&#xff1a;ip可以直接訪問到網站&#xff0c;其他域名指向服務器也可訪問 排查&#xff1a;1&#xff09;首先理解&#xff0c;怎樣才算被墻&#xff1a;大陸…

python 庫整理_自己整理的PYTHON庫

1、操作Excel1)Pylightxl地址&#xff1a;https://pypi.org/project/pylightxl文檔&#xff1a;https://pylightxl.readthedocs.io/en/latest/2)Openpyxl地址&#xff1a;https://pypi.org/project/openpyxl/文檔&#xff1a;https://openpyxl.readthedocs.io/en/stable/2、操作…

PHP發送郵件

先看一下HTML如何發送郵件 HTML發送郵件首先得使用超鏈接標簽<a> 之后使用mailto:鏈接收件人郵件地址 用bcc鏈接發件人郵箱&#xff08;加密抄送&#xff0c;cc為直接抄送&#xff09; mailto 和bcc/cc之間用?連接 subject郵件主題&#xff0c;body郵件內容&#xff0…

node.js 實現掃碼二維碼登錄

最近在做一個掃碼登錄功能&#xff0c;為此我還在網上搜了一下關于微信的掃描登錄的實現方式。當這個功能完成了后&#xff0c;我決定將整個實現思路整理出來&#xff0c;方便自己以后查看也方便其他有類似需求的程序猿些。 要實現掃碼登錄我們需要解決兩個問題&#xff1a; 1.…

喇叭正反相位測試音頻_FIR濾波器能給音頻擴聲帶來怎樣的幫助?

隨著數字音頻的快速發展&#xff0c;近些年在音頻擴聲領域&#xff0c;經常能聽到音頻技術人士討論FIR數字濾波器&#xff0c;有些說法和廠家的宣傳難免有些過于神化&#xff0c;有些廠家的技術工程師竟然宣稱&#xff0c;自己的FIR濾波器能把每只揚聲器或者整組擴聲系統的相位…

使用c語言easy—x庫實現實時鐘表

先了解一下easy-x庫 EasyX 是針對 C 的圖形庫&#xff0c;可以幫助 C語言初學者快速上手圖形和游戲編程。 可以通過官網下載&#xff0c;文件很小&#xff0c; easy-x的支持頭文件是 #include<graphics.h>下載之后雙擊打開會有所有easy-x函數的語法和作用&#xff0c;中…

java基礎—方法重載(overload)

一、方法的重載 方法名一樣&#xff0c;但參數不一樣&#xff0c;這就是重載(overload)。 所謂的參數不一樣&#xff0c;主要有兩點&#xff1a;第一是參數的個數不一樣&#xff0c;第二是參數的類型不一樣。只要這兩方面有其中的一方面不一樣就可以構成方法的重載了。 1 packa…

word 編輯域中的漢字_word中插入的cad對象無法雙擊編輯問題解決記錄

昨日&#xff0c;安裝了天正插件5.0后&#xff0c;插入word中的cad圖無法編輯了&#xff0c;彈出提示的大意是檢查是否安裝了cad或者是否關閉了CAD中所有的彈窗。在此之前&#xff0c;計算機裝了office2010和cad2014及cad2018&#xff0c;office自動關聯cad2018&#xff0c;即使…

php實現注冊登陸驗證

歡迎界面很簡單&#xff0c;直接放上代碼 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head&…

iOS touch事件單擊雙擊區分響應

如果您的 iPhone 應用里有個 view&#xff0c;既有單擊操作又有雙擊操作。用戶雙擊 view 時&#xff0c;總是先執行一遍單擊的操作再執行雙擊的操作。所以直接判斷時就會發現不能直接進入雙擊操作。下面是區分 touch 事件是單擊還是雙擊的方法 -(void)singleTap{ NSLog(&quo…

搭建高可用的redis集群,避免standalone模式帶給你的苦難

現在項目上用redis的話&#xff0c;很少說不用集群的情況&#xff0c;畢竟如果生產上只有一臺redis會有極大的風險&#xff0c;比如機器掛掉&#xff0c;或者內存爆掉&#xff0c;就比如我們生產環境 曾今也遭遇到這種情況&#xff0c;導致redis內存不夠掛掉的情況&#xff0c;…

python計算a的平方加b的平方_NumPy計算范數2的平方

老實說&#xff0c;沒有比np.inner或np.dot更快的了。如果你覺得中間變量很煩人&#xff0c;你可以創建一個lambda函數&#xff1a;sqeuclidean lambda x: np.inner(x, x)np.inner和np.dot利用BLAS例程&#xff0c;幾乎肯定比標準的元素乘法加和快。In [1]: %%timeit -n 1 -r …

php連接MySQL

先說一下我踩了三天的坑 我在這之前用mysql申請了一個數據庫&#xff0c;然后用php連接一直連接不上&#xff0c;試了許多辦法&#xff0c;都不行 下載MySQL時顯示3306端口被占用&#xff0c;所以選了3307 一直報錯&#xff0c;三天后&#xff0c;終于知道了&#xff0c;你用的…

SVG動畫

動畫原理 SVG動畫&#xff0c;就是元素的屬性值關于時間的變化。 如下圖來說&#xff0c;元素的某個屬性值的起始值&#xff08;from&#xff09;到結束值&#xff08;to&#xff09;在一個時間段&#xff08;duration&#xff09;根據時間函數&#xff08;timing-function&…

bootstrap彈出的模態框水平垂直居中的實現

學習javascript從入門到放棄&#xff01;&#xff0c;這是第一篇隨筆&#xff0c;經驗不足&#xff0c;如有不當之處&#xff0c;還望指出。好了廢話不多說直接切入正題吧 1.bootstrap默認的model寫法&#xff1a; //觸發模態框的button <button data-toggle"modal&quo…

python開發實踐教程_Python開發實踐教程

前言第一章 通過求三角形面積步入Python程序世界 案例1-1 求三角形面積 導讀 知識梳理與擴展 小結 練習一第二章 常用運算、使用自定義函數 案例2-1 用函數的方法計算三角形面積 導讀 案例2-2 開發一個求三角形面積的工具包 知識梳理與擴展 小結 練習二第三章 分支、循環和列表…