はじめに
この記事では、アプリケーションのバッテリー消費を最適化するためのヒントを提供します。
接続が失われたときにバックグラウンド更新サービスを無効にするか、バッテリー残量が少ないときに更新レートを下げることにより、バッテリーに対するアプリケーションの影響を大幅に最小限に抑えることができます。
一部のバックグラウンドサービス(ネットワークからの更新やアプリケーションコンテンツのダウンロード、複雑な計算など)は、バッテリーレベルが低いときに起動の頻度を無効にするか減らすことをお勧めします。 そのようなアクションでは、たとえば、デバイスの現在の充電状態、接続されているドッキングステーションの存在、ネットワーク接続の存在など、いくつかの要因を考慮することが重要です。 以下は、これらの値を取得し、変更を監視する方法です。
現在の充電状態
BatteryManagerクラスは、対応するインテントのバッテリー充電のレベルと状態に関する情報を送信します。 この場合、BroadcastReceiverを登録して、バッテリーの状態に関するタイムリーな情報を受け取ることができます。 そして、受信者を登録せずにこのデータを一度だけ取得できます。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryIntent = context.registerReceiver(null, ifilter);
受信したインテントから、現在のバッテリーレベル、充電状態、およびACネットワークまたはACからの充電に関する情報が取得されます。
public void getBatteryStatus(Intent batteryIntent) { // ( ) ? int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // ? int chargePlug = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; }
通常、デバイスがACメインから充電している場合、アプリケーションのバックグラウンド更新の頻度を最大化し、USB経由で充電している場合は減らし、デバイスがまったく充電状態にない場合は最小限に抑えることは価値があります。
同じ場合、デバイスの充電状態を監視する必要がある場合、BroadcastReceiverアプリケーションのマニフェストに登録する必要があります。このアプリケーションは、充電器の接続/切断に関するメッセージを受信します。 このインテントフィルターでは、 ACTION_POWER_CONNECTEDおよびACTION_POWER_DISCONNECTEDを追加する必要があります。
<receiver android:name=".PowerConnectionReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> </intent-filter> </receiver>
public class PowerConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { getBatteryStatus(intent); } }
現在のバッテリー
現在の相対バッテリー充電は、現在の充電と最大充電から計算できます。
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale;
バッテリの状態を定期的に監視することは、バッテリ自体のリソースを消費することに言及する価値があります。 したがって、充電レベルの特定の変化、つまり低充電レベルのみを監視することをお勧めします。
<receiver android:name=".BatteryLevelReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_BATTERY_LOW"/> <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/> </intent-filter> </receiver>
バッテリー残量が少なくなったら、すべてのバックグラウンド更新または計算をオフにすることをお勧めします。
ドックのステータスとタイプ
Androidデバイスには多くのドッキングステーションがあります。 たとえば、車のドッキングステーションまたはAsus Transformerのドッキングキーボード。 ただし、ほとんどのドッキングステーションはデバイス自体を充電します。
action'a ACTION_DOCK_EVENTからドックのタイプとステータスに関する情報を取得できます。 一度取得できます:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); Intent dockIntent = context.registerReceiver(null, ifilter);
または、マニフェストにBroadcastReceiverを追加し、アクションを指定して、通知をサブスクライブします。
<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>
ドックに関する情報は次のように取得されます。
public void getDockStatus(Intent dockIntent) { // int dockState = dockIntent.getIntExtra(Intent.EXTRA_DOCK_STATE, -1); boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED; // boolean isCar = dockState == Intent.EXTRA_DOCK_STATE_CAR; boolean isDesk = dockState == Intent.EXTRA_DOCK_STATE_DESK || dockState == Intent.EXTRA_DOCK_STATE_LE_DESK || dockState == Intent.EXTRA_DOCK_STATE_HE_DESK; }
値EXTRA_DOCK_STATE_HE_DESKおよびEXTRA_DOCK_STATE_LE_DESKは、APIバージョン11でのみ表示されました。
ネットワーク接続状態
アプリケーションのバックグラウンド更新またはネットワークからの長時間のダウンロードを実行する前に、接続とそのおおよその速度を確認する必要があります。 ConnectivityManagerクラスを使用してこれを行うことができます。
インターネット接続の定義:
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork.isConnectedOrConnecting();
また、ダウンロードを開始する前に現在の接続の種類を判断することも価値があります。 これは重要です 通常、モバイルインターネット接続の速度はWi-Fiよりも低く、トラフィックの価格は高くなります。
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
適切なアクションを指定してBroadcastReceiverをマニフェストに追加することにより、接続ステータスの変更の通知をサブスクライブできます。
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
このような変更は頻繁に発生する可能性があるため、更新またはダウンロードが以前に無効にされた場合にのみ、これらのアラートを監視することをお勧めします。 通常、更新を開始する前に接続を確認するだけで十分であり、接続が利用できない場合は、通知をサブスクライブします。
アラートのオン/オフを切り替えます
バッテリー、ドック、および接続のアラートを常に保持することはお勧めしません。 デバイスを頻繁に起動します。 最善の解決策は、必要な場合にのみアラートを含めることです。
PackageManagerクラスを使用すると、BroadcastReceiversのオン/オフなど、マニフェストで宣言されている要素の状態を変更できます 。
ComponentName receiver = new ComponentName(context, CustomReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
同様の手法を使用すると、たとえば、接続が切断された場合、ネットワークステータスの変更に関する通知のみがオンのままになります。 接続が表示されたら、ネットワークの変更に関するアラートをオフにして、現在の接続のみを確認できます。
同様の手法を使用して、Wi-Fiなどのより高い帯域幅の接続が確立されるまで、ネットワークからのデータのダウンロードを遅らせることもできます。
この記事は、アプリケーションによるバッテリー消費を最適化するためのAndroidトレーニングプログラムの一連のヒントを無料で翻訳したものです。