トップ地図アプリMap > Activityの状態を保存する

地図アプリMap: Activityの状態を保存する

はじめに

スマホの場合は地図は通常、縦長画面でよいが、タブレットの場合は画面の回転に対応できる方がよい。 地図アプリMapXでは回転(画面の向きの変更)に対応していない。

画面の向きを変えると、アクティビティが破棄されることがある。 そのため、アプリではアクティビティの再作成に必要な情報を保存する必要がある。 その方法の 1 つは、Bundle オブジェクト内にインスタンス状態を保存することである[1]。

現在、朝Mapを開いたときなど、地図が表示されないことがある。強制終了して、起動しなおしている。 この問題は Activityの保存で解決しないかも知れないが、まずは、Activityの状態保存を行ってみる。

Activityには大量のデータを常駐させているので、全てのセーブ&リカバリーは時間がかかる。 それでは、終了&再起動とほとんど同じである。

セーブが要るものは少ない。破棄されたことが分かるならば、そのデータだけを再読み込みすればよい。

回転(画面の向きの変更)に対応する

画面の向きを変えると、onDestroy が発行され、ついで onCreate が発行される。 レンダリング用にキャッシュしたOSMバイナリレコードなど殆どのデータはそのまま使用できるため、 onDestroy で破棄して、onCreate で再読み込みを行う必要はない。

onDestroyで破棄したデータは onCreate で再読み込みする必要がある。

タイルキャッシュ(ビットマップ画像データ)は画面の向きに応じたタイルをキャッシュしているため、 画面の向きを変えた場合、該当タイルが変わる。 厳密には過不足に対応するだけでよいが、プログラム的には onDestroy でキャッシュをクリアする方が簡単である。

現在のプログラムでは、onCreate で、全てのデータを初期化しているため、これで画面の向きの変更に対応できるようになった。 効率は良くないが、当面はこれでよしとする。

長時間スリーブ後の再起動

回転への対応のためプログラムを変更したので、ひとまず、これで様子をみる。

位置情報取得が止まる

位置情報取得がバス停の待ち時間でストップしていた。 ログをチェックすると、買い物中に20分、バス停でのバス待ちからバス乗車中の13分の位置情報取得が止まっていた。 バスを降りたところで、再開している。

バス停について1,2分バス待ち中に止まったようである。この近辺にログ情報はない。 多分、OSが位置情報取得をやめたのであろう。

電池の使用を制限なしに変更してみる。もし、電池使用量が増える場合は見直す。 Service自体は動いているならば、1分間隔で位置情報取得が行われていることをチェックして、 止まっているならば再起動する方法も検討する。

リファレンス

[1] アクティビティの状態を保存する