<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                BatteryService由SystemServer創建,代碼如下: ~~~ battery = new BatteryService(context, lights); ServiceManager.addService("battery",battery); ~~~ 下面來看BatteryService的構造函數: **BatteryService.java** ~~~ public BatteryService(Context context,LightsService lights) { mContext =context; mLed = newLed(context, lights);//提示燈控制,感興趣的讀者可自行閱讀相關代碼 //BatteryService也需要和BatteryStatsService交互 mBatteryStats = BatteryStatsService.getService(); //獲取一些配置參數 mCriticalBatteryLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_criticalBatteryWarningLevel); mLowBatteryWarningLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_lowBatteryWarningLevel); mLowBatteryCloseWarningLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_lowBatteryCloseWarningLevel); //啟動uevent監聽對象,監視power_supply信息 mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply"); //如果下列文件存在,那么啟動另一個uevent監聽對象。該uevent事件來自invalid charger //switch設備(即不匹配的充電設備) if (newFile("/sys/devices/virtual/switch/invalid_charger/state").exists()) { mInvalidChargerObserver.startObserving( "DEVPATH=/devices/virtual/switch/invalid_charger"); } update();//①查詢HAL層,獲取此時的電池信息 } ~~~ BatteryService定義了3個非常重要的閾值,分別是: - mCriticalBatteryLevel表示嚴重低電,其值為4。當電量低于該值時會強制關機。該值由config.xml中的config_criticalBatteryWarningLevel控制。 - mLowBatteryWarningLevel表示低電,值為15,當電量低于該值時,系統會報警,例如閃爍LED燈。該值由config.xml中的config_lowBatteryWarningLevel控制。 - mLowBatteryCloseWarningLevel表示一旦電量大于此值,就脫離低電狀態,即可停止警示燈。該值為20,表示由config.xml中的config_lowBatteryCloseWarningLevel控制。 在BatteryService構造函數的最后調用了update函數,該函數將查詢系統電池信息,以更新BatteryService內部的成員變量。此函數代碼如下: **BatteryService.java::update** ~~~ private synchronized final void update() { native_update();//到Native層查詢并更新內部變量的值 processValues();//處理更新后的狀態 } ~~~ 1. native_update函數分析 native_update的實現代碼如下: **com_android_server_BatteryService.cpp** ~~~ static voidandroid_server_BatteryService_update(JNIEnv* env, jobject obj) { setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline); ......//獲取電池信息,并通過JNI設置到Java層對應的變量中 setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature); constint SIZE = 128; charbuf[SIZE]; //獲取信息,以下參數并不是所有手機都支持的 if(readFromFile(gPaths.batteryStatusPath, buf, SIZE) > 0) env->SetIntField(obj, gFieldIds.mBatteryStatus,getBatteryStatus(buf)); else env->SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusUnknown); ...... } ~~~ 一共有哪些電池信息呢?如表5-4所示。 :-: ![Android系統中的電池信息](https://box.kancloud.cn/383058eb84260cab264a75ae32beb183_951x401.png =951x401) 表5-4 Android系統中的電池信息 mBatteryStatus和mBatteryHealth均有幾種不同狀態,詳細信息可查看getBatteryStatus和getBatteryHealth函數的實現。 上述信息均通過從/sys/class/power_supply目錄讀取對應文件得到。和以往使用固定路徑(可能是Android 2.2版本之前)不同的是,先讀取power_supply目錄中各個子目錄中的type文件,然后根據type文件的內容,再做對應處理: - 如果type文件的內容為“Mains”:則讀取對應子目錄中的online文件,可判斷是否為AC充電。 - 如果type文件的內容為“Battery”:則從對應子目錄中其他的文件中讀取電池相關的信息,例如從temp文件獲取電池溫度,從technology文件讀取電池制造技術等。 - 如果type文件的內容為“USB”:讀取該子目錄中的online文件內容,可判斷是否為USB充電。 >[info] **提示**: 讀者可通過dumpsys battery查看自己手機的電池信息。 2. processValues分析 獲取了電池信息后,BatteryService就要做一些處理,此項工作通過processValues完成,其代碼如下: **BatteryService.java::processValues** ~~~ private void processValues() { longdischargeDuration = 0; mBatteryLevelCritical = mBatteryLevel <= mCriticalBatteryLevel; if (mAcOnline) { mPlugType = BatteryManager.BATTERY_PLUGGED_AC; } elseif (mUsbOnline) { mPlugType = BatteryManager.BATTERY_PLUGGED_USB; } else { mPlugType = BATTERY_PLUGGED_NONE; } //通知BatteryStatsService,該函數以后再分析 mBatteryStats.setBatteryState(mBatteryStatus, mBatteryHealth, mPlugType, mBatteryLevel, mBatteryTemperature, mBatteryVoltage ); shutdownIfNoPower();//如果電量不夠,彈出關機對話框 shutdownIfOverTemp();//如果電池過熱,彈出關機對話框 ......//根據當前電池信息與上次電池信息比較,判斷是否需要發送廣播等 if (比較前后兩次電池信息是否發生變化) { ......//記錄信息到日志文件 Intent statusIntent = new Intent(); statusIntent.setFlags( Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); if (mPlugType != 0 && mLastPlugType ==0) { statusIntent.setAction(Intent.ACTION_POWER_CONNECTED); mContext.sendBroadcast(statusIntent); }...... if(sendBatteryLow) { mSentLowBatteryBroadcast = true;//發送低電提醒 statusIntent.setAction(Intent.ACTION_BATTERY_LOW); mContext.sendBroadcast(statusIntent); } ...... mLed.updateLightsLocked();//更新LED燈狀態 mLastBatteryStatus= mBatteryStatus;//保存新的電池信息 ...... } ~~~ processValues函數非常簡單,此處不再詳述。另外,當電池信息發生改變時,系統會發送uevent事件給BatteryService,此時BatteryService只要重新調用update即可完成工作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看