summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/ja/training/monitoring-device-state
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html-intl/ja/training/monitoring-device-state')
-rw-r--r--docs/html-intl/ja/training/monitoring-device-state/battery-monitoring.jd120
-rw-r--r--docs/html-intl/ja/training/monitoring-device-state/connectivity-monitoring.jd70
-rw-r--r--docs/html-intl/ja/training/monitoring-device-state/docking-monitoring.jd74
-rw-r--r--docs/html-intl/ja/training/monitoring-device-state/index.jd49
-rw-r--r--docs/html-intl/ja/training/monitoring-device-state/manifest-receivers.jd50
5 files changed, 363 insertions, 0 deletions
diff --git a/docs/html-intl/ja/training/monitoring-device-state/battery-monitoring.jd b/docs/html-intl/ja/training/monitoring-device-state/battery-monitoring.jd
new file mode 100644
index 0000000..c4aafe4
--- /dev/null
+++ b/docs/html-intl/ja/training/monitoring-device-state/battery-monitoring.jd
@@ -0,0 +1,120 @@
+page.title=電池残量と充電状態の監視
+parent.title=電池消費量の最適化
+parent.link=index.html
+
+trainingnavtop=true
+next.title=ホルダーの装着状態とタイプの特定と監視
+next.link=docking-monitoring.html
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>このレッスンの内容</h2>
+<ol>
+ <li><a href="#DetermineChargeState">現在の充電状態を特定する</a></li>
+ <li><a href="#MonitorChargeState">充電状態の変化を監視する</a></li>
+ <li><a href="#CurrentLevel">現在の電池残量を特定する</a></li>
+ <li><a href="#MonitorLevel">電池残量の大きな変化を監視する</a></li>
+</ol>
+
+<h2>関連項目</h2>
+<ul>
+ <li><a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>
+</ul>
+
+</div>
+</div>
+
+<p>バックグラウンド更新が電池消費量に及ぼす影響を抑えるために更新の頻度を変更するには、初めに現在の電池残量と充電状態を調べることをおすすめします。</p>
+
+<p>アプリの更新が電池消費量に及ぼす影響の度合いは、端末の電池残量と充電状態によって異なります。AC 電源から端末を充電しているときは、更新の実行による影響はごくわずかなので、ほとんどの場合は、端末が AC 電源に接続されている限り、更新頻度を最大にして差し支えありません。逆に、端末が電池で駆動しているときは、更新頻度を下げると電池消費量を抑えることができます。</p>
+
+<p>同様に、電池残量を調べると、残量がごくわずかであるときに更新頻度を下げたり、場合によっては停止させたりすることができます。</p>
+
+
+<h2 id="DetermineChargeState">現在の充電状態を特定する</h2>
+
+<p>初めに、現在の充電状態を特定します。{@link android.os.BatteryManager} によって電池と充電状態に関するすべての詳細情報が sticky {@link android.content.Intent} としてブロードキャストされますが、この中に充電状態が格納されています。</p>
+
+<p>これは sticky インテントであるため、{@link android.content.BroadcastReceiver} を登録する必要はありません。{@code registerReceiver} を呼び出し、{@code null} をレシーバとして渡すだけで(次のコード例を参照)、現在の電池状態のインテントが返されます。ここで実際の {@link android.content.BroadcastReceiver} オブジェクトを渡すこともできますが、このレッスンでは後で更新についての処理を行うので、これは必要ありません。</p>
+
+<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+Intent batteryStatus = context.registerReceiver(null, ifilter);</pre>
+
+<p>現在の充電状態に加えて、充電中の場合は USB 経由か AC 充電器経由かを調べることもできます。<p>
+
+<pre>// 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 = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
+boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
+boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;</pre>
+
+<p>一般的には、端末が AC 充電器に接続されているときはバックグラウンド更新の頻度を最大にし、USB 経由で充電中のときは頻度を下げ、電池で駆動中のときはさらに頻度を下げます。</p>
+
+
+<h2 id="MonitorChargeState">充電状態の変化を監視する</h2>
+
+<p>充電状態は、端末が充電器に接続されたときにすぐに変化するので、充電状態の変化を監視し、その変化に応じて更新の頻度を変更することが重要です。</p>
+
+<p>{@link android.os.BatteryManager} は、端末が電源に接続されたときや接続が解除されたときに、アクションをブロードキャストします。このようなイベントは、アプリが実行中でないときでも受信することが重要です。特にそのイベントが、アプリのバックグラウンド更新を開始するためにアプリを起動させる頻度に影響するものである場合です。したがって、{@link android.content.BroadcastReceiver} をアプリのマニフェスト内で登録し、両方のイベントを受信するために {@link android.content.Intent#ACTION_POWER_CONNECTED} と {@link android.content.Intent#ACTION_POWER_DISCONNECTED} をインテント フィルタ内で定義します。</p>
+
+<pre>&lt;receiver android:name=".PowerConnectionReceiver">
+ &lt;intent-filter>
+ &lt;action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
+ &lt;action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
+ &lt;/intent-filter>
+&lt;/receiver></pre>
+
+<p>関連付けられている {@link android.content.BroadcastReceiver} 実装の中で、前のステップで説明したように、現在の充電状態と充電方法を抽出します。</p>
+
+<pre>public class PowerConnectionReceiver extends BroadcastReceiver {
+ &#64;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 == BATTERY_PLUGGED_USB;
+ boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
+ }
+}</pre>
+
+
+<h2 id="CurrentLevel">現在の電池残量を特定する</h2>
+
+<p>状況によっては、現在の電池残量がわかると便利なことがあります。たとえば、電池残量が所定のレベルを下回った場合にアプリのバックグラウンド更新の頻度を下げることができます。</p>
+
+<p>現在の電池残量を調べるには、次に示すように、電池状態のインテントから現在の電池残量と最大量を抽出します。</p>
+
+<pre>int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
+int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
+
+float batteryPct = level / (float)scale;</pre>
+
+
+<h2 id="MonitorLevel">電池残量の大きな変化を監視する</h2>
+
+<p>電池状態を継続的に監視することは簡単ではありませんが、その必要もありません。</p>
+
+<p>一般的に、電池残量を継続的に監視するほうが、電池への影響はアプリの通常の動作によるものよりも大きくなるため、電池残量の大きな変化のみを監視することをおすすめします。特に、端末が電池残量低下状態に入ったときや、その状態が解消されたときです。</p>
+
+<p>次に示すマニフェストの断片は、ブロードキャスト レシーバの中にあるインテント フィルタ要素からの抜粋です。このレシーバは、端末が電池残量低下状態に入ったときや、その状態が解消されたときに呼び出されます。そのために、{@link android.content.Intent#ACTION_BATTERY_LOW} と {@link android.content.Intent#ACTION_BATTERY_OKAY} を受信します。</p>
+
+<pre>&lt;receiver android:name=".BatteryLevelReceiver">
+&lt;intent-filter>
+ &lt;action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
+ &lt;action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
+ &lt;/intent-filter>
+&lt;/receiver></pre>
+
+<p>一般的に、電池残量がごくわずかになったときはアプリのバックグラウンド更新をすべて停止することをおすすめします。データがいくら新しくても、端末自体の電源が切れてしまったのではデータを活用できません。</p>
+
+<p>多くの場合、端末の充電という動作が開始するのは、端末がホルダーにセットされるのと同時です。次のレッスンでは、現在のホルダーの状態を特定し、端末のホルダー装着状態の変化を監視する方法を紹介します。</p>
+
diff --git a/docs/html-intl/ja/training/monitoring-device-state/connectivity-monitoring.jd b/docs/html-intl/ja/training/monitoring-device-state/connectivity-monitoring.jd
new file mode 100644
index 0000000..82b0c6b
--- /dev/null
+++ b/docs/html-intl/ja/training/monitoring-device-state/connectivity-monitoring.jd
@@ -0,0 +1,70 @@
+page.title=接続状態の特定と監視
+parent.title=電池消費量の最適化
+parent.link=index.html
+
+trainingnavtop=true
+
+previous.title=ホルダーの装着状態とタイプの特定と監視
+previous.link=docking-monitoring.html
+next.title=オンデマンドでのブロードキャスト レシーバ操作
+next.link=manifest-receivers.html
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>このレッスンの内容</h2>
+<ol>
+ <li><a href="#DetermineConnection">インターネット接続の有無を特定する</a></li>
+ <li><a href="#DetermineType">インターネット接続のタイプを特定する</a></li>
+ <li><a href="#MonitorChanges">接続状態の変化を監視する</a></li>
+</ol>
+
+
+<h2>関連項目</h2>
+<ul>
+ <li><a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>
+</ul>
+
+</div>
+</div>
+
+<p>反復アラームとバックグラウンド サービスの用途のうち代表的なものとしては、インターネット リソースからアプリのデータを定期的に更新するためのスケジュール設定や、データのキャッシュへの格納、長時間に及ぶダウンロードの実行などがあります。しかし、インターネットに接続されていないときや、速度が低すぎるためにダウンロードを完了できない場合にまで、更新をスケジューリングするために端末をスリープ状態から復帰させる必要があるでしょうか。</p>
+
+<p>{@link android.net.ConnectivityManager} を使用すると、端末が実際にインターネットに接続されているかどうかと、接続されている場合の接続タイプを調べることができます。</p>
+
+
+<h2 id="DetermineConnection">インターネット接続の有無を特定する</h2>
+
+<p>端末がインターネットに接続されていない場合は、インターネット リソースに基づく更新をスケジューリングする必要性はありません。次のスニペットは、{@link android.net.ConnectivityManager} を使用してアクティブなネットワークを問い合わせて、インターネットに接続しているかどうかを特定する方法を示すものです。</p>
+
+<pre>ConnectivityManager cm =
+ (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
+boolean isConnected = activeNetwork.isConnectedOrConnecting();</pre>
+
+
+<h2 id="DetermineType">インターネット接続のタイプを特定する</h2>
+
+<p>現在使用可能なインターネット接続のタイプも調べることができます。</p>
+
+<p>端末の接続のタイプとしては、モバイル データ、WiMAX、Wi-Fi、イーサネットがあります。次に示すように、アクティブなネットワークのタイプを問い合わせると、使用可能な帯域幅に合わせて更新頻度を変更することができます。</p>
+
+<pre>boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;</pre>
+
+<p>モバイル データ接続のコストは Wi-Fi 接続を大きく上回る傾向があるため、端末がモバイル接続しているときはアプリの更新頻度を下げるのが一般的です。同様に、大量のデータをダウンロードするときは、Wi-Fi 接続されるまで停止するとよいでしょう。</p>
+
+<p>更新を停止した場合は、接続状態の変化を受信することが重要です。インターネット接続が確立されたら更新を再開できるようにするためです。</p>
+
+
+<h2 id="MonitorChanges">接続状態の変化を監視する</h2>
+
+<p>接続状態の詳細が変化すると、{@link android.net.ConnectivityManager} によって {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}({@code "android.net.conn.CONNECTIVITY_CHANGE"})アクションがブロードキャストされます。アプリのマニフェスト内でブロードキャスト レシーバを登録し、このような変化を検出することで、それに応じてアプリのバックグラウンド更新を再開(または停止)することができます。</p>
+
+<pre>&lt;action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></pre>
+
+<p>端末の接続状態の変化は、きわめて頻繁になることもあります。このブロードキャストは、モバイル データ接続と Wi-Fi 接続とが切り替わるたびに発行されるからです。したがって、このブロードキャストの監視は、更新やダウンロードを停止した後に再開すべきかどうかを判断するために限って行うことをおすすめします。一般的には、更新を開始する前にインターネット接続の有無を調べれば十分です。インターネットに接続していない場合は、再び接続されるまでの間、更新を停止します。</p>
+
+<p>このようにするには、マニフェスト内で宣言したブロードキャスト レシーバのオンとオフを切り替える必要があります。これについて、次のレッスンで説明します。</p>
diff --git a/docs/html-intl/ja/training/monitoring-device-state/docking-monitoring.jd b/docs/html-intl/ja/training/monitoring-device-state/docking-monitoring.jd
new file mode 100644
index 0000000..9c0e054
--- /dev/null
+++ b/docs/html-intl/ja/training/monitoring-device-state/docking-monitoring.jd
@@ -0,0 +1,74 @@
+page.title=ホルダーの装着状態とタイプの特定と監視
+parent.title=電池消費量の最適化
+parent.link=index.html
+
+trainingnavtop=true
+previous.title= 電池残量と充電状態の監視
+previous.link=battery-monitoring.html
+next.title= 接続状態の特定と監視
+next.link=connectivity-monitoring.html
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>このレッスンの内容</h2>
+<ol>
+ <li><a href="#CurrentDockState">オーディオ フォーカスをリクエストする</a></li>
+ <li><a href="#DockType">現在のホルダーのタイプを特定する</a></li>
+ <li><a href="#MonitorDockState">ホルダーの装着状態またはタイプの変化を監視する</a></li>
+</ol>
+
+
+<h2>関連項目</h2>
+<ul>
+ <li><a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>
+</ul>
+
+</div>
+</div>
+
+<p>Android 搭載端末を装着できるホルダーの種類には、さまざまなものがあります。たとえば、車載用や家庭用のホルダーがあり、デジタルかアナログかという区別もあります。ホルダー装着状態は一般的に、充電状態と密接にリンクしています。多くのホルダーは、装着されている端末に電力を供給しているからです。</p>
+
+<p>端末のホルダー装着状態が更新の頻度にどのように影響するかは、アプリによって異なります。たとえば、スポーツ センター アプリなら、卓上ホルダー装着時には更新頻度を上げ、カー ホルダー装着時には更新を完全に停止するとよいでしょう。逆に、カー ホルダー装着時に更新頻度を最大にするケースとしては、バックグラウンド サービスによって道路交通状況を更新する場合が考えられます。</p>
+
+<p>ホルダー装着状態も sticky {@link android.content.Intent} としてブロードキャストされるので、端末がホルダーに装着されているかどうかと、装着されている場合のホルダーのタイプを問い合わせることができます。</p>
+
+
+<h2 id="CurrentDockState">現在のホルダー装着状態を特定する</h2>
+
+<p>ホルダー装着状態の詳細は、{@link android.content.Intent#ACTION_DOCK_EVENT} アクションの sticky ブロードキャストにエクストラとして含まれています。これは sticky であるため、{@link android.content.BroadcastReceiver} を登録する必要はありません。次のコード例に示すように、{@link android.content.Context#registerReceiver registerReceiver()} を呼び出し、{@code null} をブロードキャスト レシーバとして渡します。</p>
+
+<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
+Intent dockStatus = context.registerReceiver(null, ifilter);</pre>
+
+<p>現在のホルダー装着状態は、次のように {@code EXTRA_DOCK_STATE} エクストラから抽出します。<p>
+
+<pre>int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);
+boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;</pre>
+
+
+<h2 id="DockType">現在のホルダーのタイプを特定する</h2>
+
+<p>端末がホルダーに装着されている場合のホルダーのタイプは、次の 4 つのいずれかです。
+<ul><li>カー</li>
+<li>卓上</li>
+<li>ローエンド(アナログ)卓上</li>
+<li>ハイエンド(デジタル)卓上</li></ul></p>
+
+<p>最後の 2 つは、Android API レベル 11 で追加されたものです。したがって、ホルダーのタイプだけがわかればよく、デジタルとアナログの区別は問わないという場合は、次のように 3 つすべてについて調べるとよいでしょう。</p>
+
+<pre>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;</pre>
+
+
+<h2 id="MonitorDockState">ホルダーの装着状態またはタイプの変化を監視する</h2>
+
+<p>端末がホルダーに装着されたり、装着が解除されたりするたびに、{@link android.content.Intent#ACTION_DOCK_EVENT} アクションがブロードキャストされます。端末のホルダー装着状態の変化を監視するには、次のコード例に示すように、アプリのマニフェスト内でブロードキャスト レシーバを登録します。</p>
+
+<pre>&lt;action android:name="android.intent.action.ACTION_DOCK_EVENT"/></pre>
+
+<p>レシーバ実装の中でホルダーのタイプと状態を抽出する方法は、前のステップで使用したものと同じです。</p>
diff --git a/docs/html-intl/ja/training/monitoring-device-state/index.jd b/docs/html-intl/ja/training/monitoring-device-state/index.jd
new file mode 100644
index 0000000..07897b1
--- /dev/null
+++ b/docs/html-intl/ja/training/monitoring-device-state/index.jd
@@ -0,0 +1,49 @@
+page.title=電池消費量の最適化
+
+trainingnavtop=true
+startpage=true
+next.title=電池残量と充電状態の監視
+next.link=battery-monitoring.html
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>依存関係と前提条件</h2>
+<ul>
+ <li>Android 2.0(API レベル 5)以上</li>
+ <li>「<a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>」を読み終えていること</li>
+</ul>
+
+<h2>関連項目</h2>
+<ul>
+ <li><a href="{@docRoot}guide/components/services.html">サービス</a>
+</ul>
+
+</div>
+</div>
+
+<p>アプリを開発するときは、ホスト端末の電池消費量への影響を抑えるよう心がける必要があります。このクラスを修了すると、開発するアプリの中でホスト端末の状態を監視し、それに基づいて機能や動作を変更することができるようになります。</p>
+
+<p>接続が失われたときはバックグラウンド サービスの更新を停止する、電池残量が低下したときは更新の頻度を下げるといった対策を講じることにより、ユーザー エクスペリエンスを損なうことなく、アプリが電池消費量に及ぼす影響を最小限に抑えることができます。</p>
+
+<h2>レッスン</h2>
+
+<!-- Create a list of the lessons in this class along with a short description of each lesson.
+These should be short and to the point. It should be clear from reading the summary whether someone
+will want to jump to a lesson or not.-->
+
+<dl>
+ <dt><b><a href="battery-monitoring.html">電池残量と充電状態の監視</a></b></dt>
+ <dd>アプリの更新頻度を変更するために現在の電池残量や充電状態の変化を特定および監視する方法を学習します。</dd>
+
+ <dt><b><a href="docking-monitoring.html">ホルダーの装着状態とタイプの特定と監視</a></b></dt>
+ <dd>最適な更新頻度は、ホスト端末がどのように使用されているかによって異なります。ホルダーの装着状態とタイプに応じてアプリの動作を変更するために、これらを特定および監視する方法を学習します。</dd>
+
+ <dt><b><a href="connectivity-monitoring.html">接続状態の特定と監視</a></b></dt>
+ <dd>インターネットに接続していないときは、オンライン ソースからアプリを更新することはできません。接続状態を調べ、それに応じてバックグラウンド更新の頻度を変更する方法を学習します。また、大量の帯域幅を消費する処理を開始する前に接続が Wi-Fi かモバイル データかを調べる方法も学習します。</dd>
+
+ <dt><b><a href="manifest-receivers.html">オンデマンドでのブロードキャスト レシーバ操作</a></b></dt>
+ <dd>マニフェスト内で宣言したブロードキャスト レシーバのオンとオフを実行時に切り替えます。端末の状態に応じて、不要なレシーバを無効にすることができます。効率を上げるために、状態変化レシーバのオンとオフを切り替える方法や、端末が特定の状態になるまでアクションを延期する方法を学習します。</dd>
+</dl> \ No newline at end of file
diff --git a/docs/html-intl/ja/training/monitoring-device-state/manifest-receivers.jd b/docs/html-intl/ja/training/monitoring-device-state/manifest-receivers.jd
new file mode 100644
index 0000000..7635d9f
--- /dev/null
+++ b/docs/html-intl/ja/training/monitoring-device-state/manifest-receivers.jd
@@ -0,0 +1,50 @@
+page.title=オンデマンドでのブロードキャスト レシーバ操作
+parent.title=電池消費量の最適化
+parent.link=index.html
+
+trainingnavtop=true
+
+previous.title=接続状態の特定と監視
+previous.link=connectivity-monitoring.html
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>このレッスンの内容</h2>
+<ol>
+ <li><a href="#ToggleReceivers">効率を上げるために状態変化レシーバのオンとオフを切り替える</a></li>
+</ol>
+
+
+<h2>関連項目</h2>
+<ul>
+ <li><a href="{@docRoot}guide/components/intents-filters.html">インテントとインテント フィルタ</a>
+</ul>
+
+</div>
+</div>
+
+<p>端末の状態変化を監視する最も単純な方法は、監視対象とする状態ごとに {@link android.content.BroadcastReceiver} を作成し、それぞれをアプリのマニフェスト内で登録するというものです。これらの各レシーバ内で、端末の現在の状態に基づいて反復アラームのスケジュールを再設定します。</p>
+
+<p>この方法のデメリットは、これらのレシーバのいずれかがトリガされるたびに端末がスリープから復帰することですが、このことは必要以上に頻繁に発生する可能性があります。</p>
+
+<p>これよりも良い方法は、実行時にブロードキャスト レシーバをオンまたはオフにするというものです。このようにすれば、マニフェスト内で宣言したレシーバを受動的アラームとして使用できます。つまり、このアラームは、必要なときにだけシステム イベントによって呼び出されます。</p>
+
+
+<h2 id="ToggleReceivers">効率を上げるために状態変化レシーバのオンとオフを切り替える </h2>
+
+<p>{@link android.content.pm.PackageManager} を使用すると、マニフェスト内で定義されているコンポーネントの有効化状態を切り替えることができます。このコンポーネントにはブロードキャスト レシーバも該当するので、次に示すようにオンとオフを切り替えることができます。</p>
+
+<pre>ComponentName receiver = new ComponentName(context, myReceiver.class);
+
+PackageManager pm = context.getPackageManager();
+
+pm.setComponentEnabledSetting(receiver,
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP)</pre>
+
+<p>この手法を使用すれば、接続が失われたことが判明した場合に、接続状態変化レシーバ以外のレシーバをすべて無効にすることができます。逆に、接続が確立された後は、接続状態変化の受信を停止します。オンラインかどうかを調べるのは、更新を実行する直前や、反復更新アラームのスケジュール再設定の直前だけで十分です。</p>
+
+<p>同じ手法を使用して、大量の帯域幅を必要とするダウンロードを延期することもできます。それには、接続状態の変化をリッスンするブロードキャスト レシーバを有効にしておき、端末が Wi-Fi に接続されたらダウンロードを開始します。</p>