1. 程式人生 > >Android狀態列顯示電池狀態程式碼流程分析

Android狀態列顯示電池狀態程式碼流程分析

BatteryController.java
註冊廣播接收器,接收Intent.ACTION_BATTERY_CHANGED廣播
之後呼叫BatteryStateChangeCallback cb.onBatteryLevelChanged(level, plugged)來回調重新整理狀態
其中,BatteryStateChangeCallback只是定義的一個interface:
    public interface BatteryStateChangeCallback {
        public void onBatteryLevelChanged(int level, boolean pluggedIn);
    }
它的具體實在QuickSettingsModel.java中:
    // BatteryController callback
    @Override
    public void onBatteryLevelChanged(int level, boolean pluggedIn) {
        mBatteryState.batteryLevel = level;
        mBatteryState.pluggedIn = pluggedIn;
        mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
    }
PS:我們可以看到QuickSettingsModel這個類實現了好幾個介面,這些介面都一些回撥:
class QuickSettingsModel implements BluetoothStateChangeCallback,
        NetworkSignalChangedCallback,
        BatteryStateChangeCallback,
        BrightnessStateChangeCallback,
        RotationLockControllerCallback,
        LocationSettingsChangeCallback {
...
}
繼續往下看:
private RefreshCallback mBatteryCallback;
這裡主要呼叫了refreshView方法來更新檢視,看看它都做了些什麼:
        public void refreshView(QuickSettingsTileView ignored, State state) {
            if (mShowWhenEnabled) {//這是一個開關,使用者控制是否設定其可見性
                mView.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
            }
            if (state.iconId != 0) {//更新圖示
                mView.setImageDrawable(null); // needed to flush any cached IDs
                mView.setImageResource(state.iconId);
            }
            if (state.label != null) {//更新文字
                mView.setText(state.label);
            }
        }
至此,流程結束
如果需要在電池圖示上顯示當前電量百分比:可能需要修改如下地方:

        public void refreshView(QuickSettingsTileView ignored, State state) {
            if (mShowWhenEnabled) {
                mView.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
            }
            if (state.iconId != 0) {
                mView.setImageDrawable(null); // needed to flush any cached IDs
                mView.setImageResource(state.iconId);

            }
if (state instanceof BatteryState) {
//如果走到這裡說明更新的是電池?上面的iconId 是幹啥的還有待進一步研究
Log.d(TAG, "quan #################################################### state.batteryLevel is " + ((BatteryState)state).batteryLevel);
}
else {
Log.d(TAG, "quan #################################################### mBatteryState.batteryLevel is " + mBatteryState.batteryLevel);
}

            if (state.label != null) {
                mView.setText(state.label);
            }
        }


另外,
BatteryMeterView.java中有關於狀態列電池初始化的程式碼。

相關推薦

Android狀態顯示電池狀態程式碼流程分析

BatteryController.java 註冊廣播接收器,接收Intent.ACTION_BATTERY_CHANGED廣播 之後呼叫BatteryStateChangeCallback cb.onBatteryLevelChanged(level, plugged)來

Android狀態顯示藍芽耳機電量

1.HeadsetStateMachine.java static { classInitNative(); VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID = new HashMap&l

manjaro狀態顯示實時網速cpu記憶體等資訊

開源專案indicator-sysmonitor地址:https://github.com/fossfreedom/indicator-sysmonitor 1,開啟manjaro自帶的軟體商店:        搜尋

Qt5主視窗狀態顯示時間

使用Qt Creator建立預設的窗體程式後,主視窗QMainWindow有statusBar狀態列,在此狀態列實時顯示時間可以使用下面方法實現: mainwindow.h檔案內容: #ifndef MAINWINDOW_H #define MAINWINDOW_H #incl

Android中沉浸式狀態,改變狀態顏色類似QQ樣式

1、使用該功能需要使用到第三方庫SystemBarTint 下載地址:https://github.com/jgilfelt/SystemBarTint 2、需要在AndroidMainfest檔案中Application設定樣式 android:the

vscode狀態顯示

var pclintBar: vscode.StatusBarItem = vscode.window.createStatusBarItem(StatusBarAlignment.Right, 200); pclintBar.text = '$(megaphone) pclint檢查

[Xcode10 實際操作]一、博主領進門-(14)在頂部狀態顯示風火輪以及為應用程式新增應用圖示

本文將演示在頂部狀態列顯示風火輪。 主要用於在執行某個長時間動作時,提示使用者耐心等待動作的執行。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 應用程式物件的核心作用,是提供程式執行期間的控制和協作。 每一個程式必須有,且僅有一個應用例項。 1 im

Android 沉浸式狀態效果(狀態與內容完全融合、類似於iphone 7.0系統)

今天偶然間發現一種叫做沉浸式狀態列的、看了之後激動的非常、立馬開操! Activity的setContentView之前新增 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

android沉浸式狀態、變色狀態、透明狀態、修改狀態顏色及透明

首先我要區分清楚沉浸式狀態列與變色狀態列。 沉浸式狀態列指的是,狀態列隱藏,在手指做了相關操作後,狀態列顯示出來,例如視訊播放器,在播放視訊時是隱藏狀態列的,但是點選螢幕的時候,狀態列會顯示出來,再例如文字閱讀器,在閱讀的時候是全屏的,然後從螢幕上方下滑或者下

Android狀態著色-透明狀態

最近專案上有需求 ,要求狀態列透明化 。還有需求是拖動狀態列標題一下的內容,標題欄的顏色要變化 。這裡所謂的既是狀態列著色,也是我們經常聽到的沉浸式狀態列,關於沉浸式的稱呼網上也有很多吐槽的,這裡就不做過多討論了,以下我們統稱狀態列著色,這樣我覺得更加容易理解。 從Andr

Android底部選單欄、Android沉浸式狀態(頂部狀態修改顏色)、自定義標題欄

0、簡介: 沒有使用TabHost切換,而是變成FragmentActivity替換Fragment;沉浸式引用的git上面的jar包。 先看圖片 1、底部導航欄 核心程式碼 <span style="white-space:pre"> </span&

Android Camera fw學習(六)-takepicture(ZSL)流程分析

備註:博文仍然是分析Android5.1 API1程式碼的學習筆記。   這次筆記主要是來分析ZSL流程的。ZSL(zear shutter lag)即零延時,就是在拍照時不停預覽就可以拍照.由於有較好的使用者體驗度,該feature是現在大部分手機都擁有的功能。   下面不再貼出大

Android Camera fw學習(五)-takepicutre(STILL_TAKEPICTURE)流程分析

備註:博文仍然是分析Android5.1的程式碼所寫的學習筆記。   前面已經瞭解過API1大概過程,這裡直奔主題。與TakePicture息息相關的主要有4個執行緒CaptureSequencer,JpegProcessor,Camera3Device::RequestThread,

hyperledger fabric超級賬本java sdk樣例e2e程式碼流程分析

 一  checkConfig  Before     1.1  private static final TestConfig testConfig = TestConfig.getConfig();  &

spi nand driver程式碼流程分析

硬體環境     主晶片:bcm63xx,      spi nand:Winbond W25N01GV 程式碼環境     linux-4.1.27/drivers/mtd         mtd_blkdevs.o  mtdblock.o  mtdchar.o  m

SpringXD 任務、啟動訊息通訊程式碼流程分析

任務部署時,xd-admin和container之間通過zookeeper的節點監聽通訊。container監聽zk deployment節點,執行部署。同事繫結kafka message consumer和reactor subscriber。 任務啟動時,xd-admin和container通過

Android 5.1 長按power鍵流程分析

private GlobalActionsDialog createDialog() { // Simple toggle style if there's no vibrator, otherwise use a tri-state if (!mHasVibrator

nova boot程式碼流程分析(四):nova與neutron的l2 agent(neutron-linuxbridge-agent)互動

#/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet)

uboot的eMMC初始化程式碼流程分析

原始碼參考九鼎科技移植的X210開發板捆綁BSP中的uboot, 版本為1.3.4 mmc初始化函式int mmc_initialize(bd_t *bis)在uboot/lib_arm/board.c中的start_armboot()函式中被呼叫(uboot

nova volume-attach程式碼流程分析

最近遇到一個bug,是使用者在nova端attach一個volume給instance後,再發起detach操作,導致該volume detach失敗且一直處於detaching狀態,藉此走讀nova volume-detach的程式碼流程,在此分享下心得筆記。