2021年8月6日金曜日

Android の仕様変更への追従 (1)

拙作の Android アプリ「Simple アナログ時計」は、最初の公開からもう9年以上も経つ、秒針付きアナログ時計のウィジェットです。細々とアップデートを積み重ね、おかげさまで高い評価をいただき(現在★4.3)、常に「アナログ時計」検索結果上位を維持してきました。

しかし、「1秒毎に画面更新するウィジェット」という、スマホアプリとしては特殊なことをやっているため、これまでの Android OS の仕様変更によって何度か「対応限界」の危機がありました。

 

Simpleアナログ時計 Simple Analog Clock
Simpleアナログ時計 (v5.1.3)

 

Alarm Manager の仕様変更 (SDK Level 19)

まず、Alarm Manager。これは「指定時間後に onReceive が来る」という便利な機能で、定期的な処理に良く使われます。当初はこれを使うことで1秒毎の針更新も難無く実現していました。

ところが Android 4.4 (SDK Level 19) で「onReceive が指定時間後に来ることは保証されない」という仕様に変更されました。それでも Android 5.0 まではちゃんと1秒毎に onReceive が来ていたのですが、Android 5.1 で「最短5秒程度」にされてしまいました。これでは秒針は使えません。

もう仕方ないので Alarm Manager を使うことを諦め、内部動作を postDelayed() を使うように大改造することで、なんとか「1秒毎の更新」を実現しました。


Battery Optimization の導入 (SDK Level 23)

しばらくはこれで安定動作していたのですが、今度は Android 6.0 (SDK Lvel 23) で Battery Optimization 機能が導入されました。バックグラウンドで長時間動作しているアプリを強制的に停止させることで、スマホのバッテリー寿命を延ばす仕組みです。

端末メーカーによって実装方法が異なるらしく、多くの場合は問題なかったのですが、一部のユーザーから「突然止まった」という報告が来るようになりました。

幸い、OS のほうの設定に、アプリ単位で「強制停止の対象外」を指定できるようになっていたため、これを利用して回避することができました。

ちなみに、Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
で Intent を作成し、startActivity() を呼べば、設定が開けます。


次回へ続きます。