ロック画面でウィジェットがリロードされるタイミングを調べてみた
ウィジェットが再読み込みされるのはいつなのだろう?と、ずっと以前から気にしてはいたのですが、誰からも問い合わせがないので、調べることもなく気にしないようにしていました。
そうは言うものの、ウィジェットを作る度に、気になっていたことも事実です。
現在、サイト更新の谷間にありますので、このタイミングを利用して調べてみました。
サンプルウィジェットを用意する
今回のお題を実現させるために用意したウィジェットですが、相変わらずシンプルな構成でございます。
おまけに、内容もシンプルで、「読み込まれた時刻を表示する」というものです。
システム時計と比べることで、リロードされたかどうかが分かるようにしてあります。
ダウンロードはこちらからどうぞ。
いろいろなタイミングでその挙動を調べてみる
スリープボタンを利用
では、手始めに、スリープボタンを押して強制的にスリープさせ、数分後にもう一度スリープボタンを押して、ロック画面を表示させてみました。
システム時計とウィジェット時計に、2分の差があります。
ウィジェットで取得した時刻が19:56であり、スリープ中にリロードがなかったため、スリープ復帰後の時刻も19:56という結果です。
対してシステム時計は、スリープ中でもその時刻を刻んでおり、結果的に2分の差が生じました。
私が放置していた時間ということになりますね。
やはりスリープ程度ではリロードしないようです。
オートスリープを利用
強制的なスリープではなく、スリープするところから放置してみます。
スリープしてから気付いたのですが、自動でスリープ状態に入る時間を長くしていたので、スリープで放っておく時間も少し長めにしておきました。
今回は、システム時計とウィジェット時計に、22分の差があります。
私が放置していた時間ということなのですが、どちらにしてもスリープ程度ではリロードしてくれそうにないですね。
セルフスリープを利用する
分単位の放置では期待できないので、時間単位で放置してみることにします。
ここで利用したのが「セルフスリープ」です。
iPhone関連では、初めて耳にした方がほとんどなのではないでしょうか?
私も、この表現を初めて使ってみました。
その内容はとても単純で、「私自身が寝る」というだけのことです。
寝る前に、ウィジェット時計の表示を見やすくしておきました。
いつもは午前3時に起きているのですが、この時ばかりは少し早く起きてしまいました。
スリープから復帰しましたので、スクリーンショットはその時間のものですが、5時間弱はスリープ状態にあったことが分かります。
それでも、リロードはありませんでした。
スリープには見切りをつけた方が良さそうですね。
リブートする
スリープに見切りをつけたので、確実にリロードさせるはずの再起動を試してみます。
リロードとリブートを掛けた訳ではありません。
再起動した結果、みごとにリロードされました。
当然と言えば当然ですね・・・
リスプリングする
リブートでリロードの確認ができましたので、今度は、リスプリングでリロードの確認をします。
見事にリロードされました。
これも想定内ですね。
ロック解除する
試していないパターンを探したのですが、これ以上のパターンが見つけられないので、最後の手段と思われる「ロック解除」を試してみます。
もちろん、解除してすぐロック画面にしても意味が無いので、一度ホーム画面で時間を潰します。
だからと言って、勝手にスリープに入ってしまっても二度手間になるだけですので、アプリで適当に遊ぶことにします。
結果的に数分経ってからロック画面に移行しましたが、リロードされています。
同じことを、数秒でも1時間以上でもやってみましたが、同じ結果でした。
アプローチを変えてみる
どうやら、特別なタイミングはなさそうですね。
ロックされていない状態からロック状態になった時にリロードされるようです。
ですから、リブートやリスプリングは言うまでもなく、一度ホーム画面に移行するだけで、その後のロック状態になった時にリロードされます。
では、ロック状態になった瞬間にリロードされているのか調べてみましょう。
ここで使用するウィジェットサンプルはこちらです。
内容はこれまたシンプルで、毎秒カウントするだけのものですが、読み込まれる度にリセットされるので、リロードされて何秒経ったかか分かります。
で、ホーム画面でスリープボタンを押し、数秒経ってから復帰させたロック画面で確認してみました。
3〜4秒かな?と思ったのですが、スクリーンショットを撮る動作に時間も取られたのでしょうね。
個人的に納得するために、ロック音がした瞬間にスリープボタンを押して確認しました。
スクリーンショットでは「1秒」になっていますが、目視ではきちんと「0秒」からスタートするところを確認しました。
皆さんも実機で確認してみて下さい。
まとめ
時計ウィジェットであれば、その性質上、リロードしなくても定期的に動作し続けるはずですので、その類いのものは気にする必要はありません。
問題なのは、天気予報のようなウィジェットです。
時計ほど頻繁に情報を更新するものでもないのですが、最低でも1日1回は更新すべきウィジェットの場合、しばらくロック画面のままでいると、更新されていない情報がロック画面に表示されたままなのです。
朝起きて、寝ぼけ気味にロック画面の時間と天気を確認したとしても、その天気は昨日のものである可能性が十分にあるのです。
天気や占いなど、その日の情報を示すようなウィジェットは、例えウィジェット内で1日1回更新しても、その誤差は1日になるので、1時間に1回自動更新するくらいでも良いと思います。
個人的には、手動更新用のボタンも配置するべきかと思います。
画面が消えている状態からロック画面が表示された時のイベントが取得できるのが一番良いのですが、ウィジェット(Webアプリ)の範囲ではなかなか厳しいものがありますね。
まぁ、普通に使えばロック解除する訳ですので、特に意識しなくてもリロードされているのですが、開発側としてはトラブルを防ぐためにも知っておくべきかと思いまして、調べてみました。