読者です 読者をやめる 読者になる 読者になる

2hours

1日2時間でなにができるかな

AppWidgetProviderの仕様変更

Android


前回書いたようにAndroid1.5で作成したウィジェットが、1.6アップデート後に動かなくなっていた。
連休でその辺りのことを調べてみた結果。



まず他の方が作成したウィジェットを見て回った結果、

1.6アップデート以降に手が加えられていないアプリは動かなくなってるものが多かった。





結局何が原因なのかというと、Android1.6からupdatePeriodMillisの最小値が1800000に変更されたこと。

1800000msec以下を指定した場合、自動的に1800000msecに繰り上げられてしまうらしい。





/frameworks/base/services/java/com/android/server/AppWidgetService.javaの71行目に



private static final int MIN_UPDATE_PERIOD = 30 * 60 * 1000; // 30 minutes



という記述があった。(見てるソースが最新かは分かりませんが。)







1.5までupdatePeriodMillisに1000を指定して毎秒処理を行っていたようなアプリは、

全て30分毎にしか更新されないアプリになってしまっているようだ。

まぁ私の作ったデジタル時計ウィジェットも例外ではなく、上記理由で動かなくなってた訳です。







ウィジェットでupdatePeriodMillisに小さい値を指定して更新頻度を上げた場合、

スリープ状態でも処理が走ってしまい、他のアプリへの影響、電池の消耗など問題があった。



ので、どっちにしろ更新処理は別の方法で実装するしかないなとは思ってましたが。

気が付くとDevGuideにこんな記述が。

If the device is asleep when it is time for an update
(as defined by updatePeriodMillis), then the device will wake up in order
to perform the update. If you don't update more than once per hour, this probably won't
cause significant problems for the battery life. If, however, you need to update more
frequently and/or you do not need to update while the device is asleep, then you can instead
perform updates based on an alarm that will not wake the device. To do so, set an alarm with
an Intent that your AppWidgetProvider receives, using the AlarmManager.
Set the alarm type to either ELAPSED_REALTIME or
RTC, which will only
deliver the alarm when the device is awake. Then set updatePeriodMillis to
zero ("0").


前こんなの書いてあったかな・・・。

やっぱりAlarmManager、Handler、IntentFilter辺りを使って実装するのがいいようだ。

実際どの方法がベストなのかはさっぱり分かりませんが('A`)