地図アプリ Map では万歩計で二つ、GPSで一つ、合わせて三つのブロードキャストレシーバーを実装している。 一本化できるかも知れないが、分けておいたほうが分かりやすいかも知れない。 特に、万歩計とGPS位置情報取得は独立したものであるから、分けておく方が分かりやすいであろう。
ただし、アプリMapにとらわれず、ブロードキャストを学びなおす。
システム全体にかかわる情報は「BroadcastIntent」という特殊なIntentを使って、 全てのアプリケーションに向けて発信される[1]。
BroadcastIntentには以下のようなものがある。
android.intent.action.TIME_TICK 時刻が変化した(分単位) android.intent.action.ACTION_POWER_CONNECTED 電源接続、 android.intent.action.ACTION_POWER_DISCONNECTED 電源切断、 android.intent.action.ACTION_SHUTDOWN シャットダウン、 android.net.wifi.WIFI_STATE_CHANGED ネットワーク状態が変わった
地図アプリMapでは、歩数計関連で ACTION_SHUTDOWN を受けている。以前に GPS制御に WIFI_STATE_CHANGED を使ったことがある。
地図アプリMapXでは、ACTION_SHUTDOWN は歩数計だけでなく、位置情報取得でも使いたい。
Androidはバッテリ使用を抑制するために、アプリを 24時間動かし続けることが難しい。 勿論、バッテリ消費を厭わなければやりやすいが、バッテリ消費の抑制と24時間稼働の両立が難しい。
位置情報取得の場合、自宅では不要であり、家を出たとき、開始すればよい。 自宅にいるときは、ホームルータにつながっているため、WIFI_STATE_CHANGEDで家を出たときと帰宅 を監視すればよい。
自宅にいて、スマホを使わない時間が長く続けば、ディープスリープ状態となる。 この状態では、的確に WIFI_STATE_CHANGED に反応しない懸念もある。
現在は、自宅にいても、万歩計(StepCounter)のイベントもキャッチしているため、 WIFI_STATE_CHANGED で外出を検出できる可能性が高い。
自宅を含めて、一日の歩数をカウントするためには、朝一番の StepCounter の値が必要となる。 地図アプリが24時間動き続けているならばこれができる。
現在、地図アプリMapは正確には 24時間動作していない。 バグでダウンしたか、Android OSが停止したのであろう。 スギサポwalk もこの 8日18時間28分中で稼働時間は 8日17時間38分 となっている。 差の 50分は止まっていたのだろうか?
地図アプリMapでは、24時間稼働のServiceで StepCounter のイベントを常時、受けているが MainActivityでもこれを受けて地図画面にその日の歩数を表示している。
二重処理であるが、MainActivityの動作は画面に表示されているときだけであるから、 バッテリ消費の増加は僅かである。
位置情報と同じように、Serviceで受けた歩数データを broadcast で MainActivity に送る方法もある。 プログラム的にはこの方は簡単である。Service
今回調べた限りでは、外出、帰宅で Wi-Fi の OFF、ON を検出できなかった。 やはり、StepCounter で、動きをとらえて、位置情報取得を行い、自宅内での移動か、外出での移動かは 位置座標で判断する方が的確であろう。
自宅内では Wi-Fiによる位置情報取得の精度が高いため、バッテリ消費を抑える。