2018年3月5日月曜日

android の JobService が思った間隔で動かない...!?

android 8.0 (oreo) から、ウィジェットの肝のバックグラウンドのサービスが特定の状況以外、禁止となっていた。
そんなスゴい端末を持っていないから全くのノーチェックだったが、こりゃイタい仕様変更だ。要は、これからウィジェットを作成するなら、Service からの Timer 起動 でなく、JobScheduler を使えという話ですなぁ。

勉強がてら実験してみると、JobInfo のメソッドでジョブの繰り返しミリ秒数を設定する setPeriodic() が説明どおりに動いてくれない。

.setPeriodic(60000);

としても、ログでは 11 分間隔で動いている。「おやっ、もしかして」って感じですね。
ちなみに

.setPeriodic(180000);

とすると、予想どおり 13 分間隔になった。
説明書きのどこを読んでも、「プラス 10 分」とは記載されていないようなので、何の確信もない。ただの実験結果であるが、クサいですなぁ。
一応、エミュレータ以外にも、実端末(SH-M03 v6.0.1)で試したが同様の結果だった。

ということは、

.setPeriodic(0);

ならどうなるかって感じですな。裏を読んで「『0』って繰り返さない意味かも」って考えちゃいますけどね。素直に 10 分間隔という話。

まぁ今は、「こんなこと言ってた人がいたなぁ」って思っててもらえれば、悩んだ数時間が報われる。
しかし、これが事実だと、わざわざ JobScheduler 使ってもウィジェットの情報更新間隔が 10 分以下にならないわけだ。ウィジェット本体が持つ updatePeriodMillis を使うと最小が 30 分間隔だから、まだちょっとはマシなんだろうなぁ。


※android 8.0 の場合は、

.setPeriodic(899000);

な感じで、15 分以下だと、

03-05 14:16:47.065 6980-6980/jp.dpp.fmwatch W/JobInfo: Specified interval for 1 is +14m59s0ms. Clamped to +15m0s0ms

こんなログが出力されるので、15 分以下は全部、15 分間隔にしちゃうらしい。
でもまだ実際には、一度も繰り返してくれてないので格闘中だ。

<追記>
どうも Oreo で setPeriodic が無効になったという噂を見かけた。情報元が Google ではないのであくまで噂だが、実際に動かないので信憑性は高い。
なので、これから使うなら、

firebase-jobdispatcher-android

がお勧め。
モジュール側の build.gradle の dependencies に一行

implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

を加えるだけで使えるようになるライブラリ。
これだと JobScheduler に対応していない OS バージョンでも、持ってる機能だけで何とか「なんちゃって JobScheduler」を使えるようにしてくれるから便利。
こんなに悩むことになるなら、最初からこれを使っておけばよかった。マジで...。


0 件のコメント:

コメントを投稿