Android 耗電優化

2021-09-23 19:37:58 字數 3908 閱讀 2649

一、監視電量的變化和充電狀態

當你通過降低後台任務的更新頻率來降低其對電量的影響時,檢測當前的電量和充電狀態都是乙個好的開始好的嘗試。

應用的更新對電量的影響最好由剩餘電量和充電狀態決定。充電時,應用的更新操作對電量的影響可以忽略不計,此時你應該最大化你的重新整理頻率。相反的沒有充電時,降低你應用的更新操作頻率來延遲電量使用時間。

相似的你可以檢測電量的變化,當電量臨近耗盡時,要降低應用更新頻率甚至停止應用。

1.確定當前充電狀態:

batterymanager廣播多有的電量和充電資訊詳情到intent裡。你不需要註冊乙個broadcastreceiver,只要簡單的呼叫registerreceiver()並傳遞乙個null作為receiver即可,當前的電量狀態資訊intent會立刻返回(當然你也可以傳遞乙個broadcastreceiver物件)。

intentfilter ifilter = new intentfilter(intent.action_battery_changed);

intent batterystatus = context.registerreceiver(null, ifilter);

你可以檢測當前的充電狀態,是通過usb方式充電還是插入充電器充電:

// are we charging / charged?

int status = batterystatus.getintextra(batterymanager.extra_status, -1);

boolean ischarging = status == batterymanager.battery_status_charging ||

status == batterymanager.battery_status_full;

// how are we charging?

int chargeplug = batterystatus.getintextra(batterymanager.extra_plugged, -1);

boolean usbcharge = chargeplug == batterymanager.battery_plugged_usb;

boolean accharge = chargeplug == batterymanager.battery_plugged_ac;

通常你可以在鏈結充電器充電時最大化後台更新的頻率,鏈結usb時減低更新頻率,沒有連線充電時再降低更新頻率。

2.監視充電狀態變化

由於充電狀態的變化即為容易,根據充電狀態的變化決定你應用後台更新的頻率變得尤為重要。無論鏈結或者埠充電裝置batterymanager都會廣播乙個action,無論你的應用是否執行,能夠接受到這個廣播都非常重要,尤其是廣播會影響你應用的啟動來執行後台任務的場景。所有,你需要註冊乙個broadcastreceiver到manifest來監聽action_power_connected和action_power_disconnected:

在你的broadcastreveiver實現裡,你可以向前面介紹的方法那樣檢測電量變化和充電狀態變化的資訊。

3.確定當前的剩餘電量

確定當前的剩餘電量在很多時候也非常有用,在電量耗費到某個水平時你需要降低後台的更新頻率。電量的獲取也是通過電量資訊的intent得到,保護使用電量和電量總容量:

int level = batterystatus.getintextra(batterymanager.extra_level, -1);

int scale = batterystatus.getintextra(batterymanager.extra_scale, -1);

float batterypct = level / (float)scale;

4.監視電量的變化情況

你不可以一直保持對電量變化的監視,你也不需要這樣作!通常來說,持續的保持對電量變化的監控對電量產生的耗費比你的應用的普通內部工作耗費的電還要多。所以監視電量使用的特殊狀態是乙個好的嘗試,尤其是進入或者退出低電量這兩個狀態。你可以通過註冊監聽action_battery_low和action_battery_okay兩個狀態的receiver來實現。

二、檢測並監控手機的停靠狀態和型別

android裝置可以有幾種停靠狀態,如車在模式、家庭模式等。停靠模式通常直接和充電狀態相關,很多停靠模式提供充電和固定裝置。停靠模式對你的應用產生什麼影響由你自己決定,如可以在桌面停靠時增加更新頻率、車載停靠模式時停止重新整理,可以在車載停靠模式時最大頻率的更新交通流量資訊。類似的,停靠狀態也是同個intent廣播的,可以通過查詢或者註冊的方式得到。

查詢當前的停靠狀態:

intentfilter ifilter = new intentfilter(intent.action_dock_event);

intent dockstatus = context.registerreceiver(null, ifilter);

int dockstate = battery.getintextra(extra_dock_state, -1);

boolean isdocked = dockstate != intent.extra_dock_state_undocked;

查詢當前的停靠型別:

boolean iscar = dockstate == extra_dock_state_car;

boolean isdesk = dockstate == extra_dock_state_desk ||

dockstate == extra_dock_state_le_desk ||

dockstate == extra_dock_state_he_desk;

監視停靠狀態的變化:

三、檢測並監視手機的聯網狀態

onnectivitymanager cm =

(connectivitymanager)context.getsystemservice(context.connectivity_service);

networkinfo activenetwork = cm.getactivenetworkinfo();

boolean isconnected = activenetwork != null &&

activenetwork.isconnectedorconnecting();

boolean iswifi = activenetwork.gettype() == connectivitymanager.type_wifi;

流動網路耗費明顯高於wi-fi,大多數時候需要在流動網路時降低更新頻率,一些工作甚至要等待wi-fi環境才能啟動執行。

監視網路變化:connectivitymanager會在任何連線網路變化的時候廣播android.net.connn.connectivity_action,可以通過註冊***receiver監聽:

四、控制廣播接收的需求

最簡單的監聽裝置狀態變化的方式就是註冊receiver到manifest來監聽響應的狀態。通常你會根據裝置狀態在每個receiver裡你會重置定時廣播。乙個直接的影響就是:每一次廣播後你的裝置都要被喚醒,潛在的可能超過了本來需要的頻率。乙個更好的方式是在執行階段通過**控制是否啟動監聽receiver。

可以使用packagemanager來切換manifest裡定義的元件的可用不可用狀態。例如:

componentname receiver = new componentname(context, myreceiver.class);

packagemanager pm = context.getpackagemanager();

pm.setcomponentenabledsetting(receiver,

packagemanager.component_enabled_state_enabled,

Android APP耗電優化

picasso context context,dispatcher dispatcher,cache cache,listener listener,requesttransformer requesttransformer,listextrarequesthandlers,stats stats...

耗電優化(一) Doze Standby

從android6.0開始,系統提供了兩種省電功能 延長電池壽命和使用時間 1.進入doze模式 在手機未充電,完全靜止且熄屏一段時間後,android系統會自動進入doze模式 2.doze模式效果 1.網路訪問被掛起 2.wake locks被無視 3.alarmmanager被推遲到下乙個ma...

Android 耗電量測試

以前在做運營商專案的時候,標書上往往會明確apk電量相關指標,包括剩餘電量 耗電量的要求必須不超過多少百分比等 其實目前對電量測試本身並沒有乙個很精確的測試方法 因為在測試的時候無法 但是我們以前測的時候還是有很多方法,比如對比測試,或者借助一些第三方的工具來進來判別等 第三方工具也會把本身劃入到統...