トップ地図アプリMapX > 地図アプリMapX ブロードキャスト

地図アプリMapX ブロードキャスト

ブロードキャスト

地図アプリ Map では万歩計で二つ、GPSで一つ、合わせて三つのブロードキャストレシーバーを実装している。 一本化できるかも知れないが、分けておいたほうが分かりやすいかも知れない。 特に、万歩計とGPS位置情報取得は独立したものであるから、分けておく方が分かりやすいであろう。

ただし、アプリMapにとらわれず、ブロードキャストを学びなおす。

システムからのbroadcast(BoradcastIntent)を受ける

システム全体にかかわる情報は「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による位置情報取得の精度が高いため、バッテリ消費を抑える。

リファレンス

[1] BroadcastIntentを受け取る
[2] Android で Wi-Fi 機能の有効・無効の変化をイベントとして取得する