編輯:關於Android編程
原文地址:http://android.xsoftlab.net/training/monitoring-device-state/index.html
作為一款優秀的APP應用,應該總是想方設法的降低電量的消耗。通過這節課的學習,你將有能力使APP可以基於設備的狀態來調整APP的功能及行為。
我們可以通過比如在斷開連接時關閉後台服務,或者在電量低的時候降低更新的頻率等等手段來降低電量的消耗。
在更改後台的更新頻次時,檢查當前的電池電量及充電狀態是我們先要做的。
應用程序的更新頻率取決於電池的電量以及充電狀態。由於設備處於充電狀態時應用的耗電量幾乎可以忽略,所以,在設備連接到充電器時,你可以將應用的刷新頻率開到最大,如果設備沒有在充電,那麼降低更新頻率可以延長電池的使命時間。
首先我們需要檢查當前的充電狀態。BatteryManager會將電池信息以及充電信息通過粘性Intent將其廣播。
因為是粘性Intent,所以不需要注冊BroadcastReceiver,只需要在調用registerReceiver()時傳一個null就可以,當前的電池狀態由該方法直接返回。你也可以在這裡傳遞一個BroadcastReceiver對象,但是我們接下來的處理方式並不是在其中做的,所以這並不是必須的。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);
如果設備當前處於充電狀態,那麼可以獲得當前的充電狀態,無論它是通過USB還是通過AC適配器充電的。
// 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;
通常的做法是:應當是在連接到AC電源適配器時,將後台的更新頻率加到最大,如果當前處於USB狀態,這個頻率應當適當降低,如果斷開充電,則應當進一步降低。
設備的充電狀態很容易隨著充電器的插入、拔出而發生變化。所以隨著充電狀態的變化應當相應的調整應用的刷新頻率。
當設備插上充電器或是拔出充電器時,BatteryManager都會廣播一個Action,所以應當注冊一個BroadcastReceiver用來監聽這些事件。
<receiver android:name=".PowerConnectionReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"> <action android:name="android.intent.action.http://blog.csdn.net/sahadev_/article/details/ACTION_POWER_DISCONNECTED"> </action></action></intent-filter> </receiver>
在該BroadcastReceiver內,你可以獲取當前的充電狀態:
public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; } }
在一些情況下還需要檢查設備的剩余電量。當電量較低時可能需要降低應用的後台服務頻率。
你可以通過以下方式獲得設備的剩余電量:
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;
應用不能一直連續不斷的監聽電池的狀態。
通常來說,一直不斷的監聽電池電量會使監聽電池的任務大於應用的實際任務,所以最好是只監聽一些比較重要的變更事件。
下面的清單文件摘自一段廣播接收器內。該廣播接收器會在電池的電量很低時或者是在電量恢復到安全水平時被觸發。它監聽了兩個事件:ACTION_BATTERY_LOW及ACTION_BATTERY_OKAY.
<receiver android:name=".BatteryLevelReceiver"><intent-filter> <action android:name="android.intent.action.ACTION_BATTERY_LOW"> <action android:name="android.intent.action.ACTION_BATTERY_OKAY"> </action></action></intent-filter> </receiver>
通常情況下,在電量很低時要關閉所有的後台更新。加載在使用APP之前,手機關機了,那麼應用的數據是否是最新的就沒那麼重要了。
在很多情況下,手機充電時是被放在一個固定的位置上的。下節課我們將會學習如何檢查設備的放置環境以及如何監測設備的放置狀態。
android中對weight的學習可以說是必須的,如果UI布局僅僅使用dp與sp等等,會讓布局顯得極度不靈活,畢竟各個手機屏幕大小不同,更別說是還有ipad之類的了,所
TabActivity在API13之後被fragment替代了,所以不建議使用效果:點擊頭像標簽,進行切換。 代碼:https://github.com/ldb
Android Emulator 給用戶提供 GPU on 選項,意思是利用 Host ( 就是運行 Emulator 的PC機) 的 GPU. 當然PC機必須把 Op
一個關於 imageView 設置 scaleType 的問題。 就在剛才 晚上9 點多的時候,我的一個外包伙伴發一個工程代碼我,叫我去看下這樣一個"