[Android] setRepeating() の誤差と setExact() setWindow()

Android 19 からAlarmMangerでの、set()、setRepeating()などの時間経過の誤差が大きくなりました。(inexact になったとあります)
理由は、バッテリー電力消費量を改善するためのようですが、実際どの程度なのか試してみました。



setRepeating(), set()のinexact

 
確かに、毎朝7時のアラームが7時1分であれば、多少は許容される場合もあるでしょうが
そもそも誤差がどれだけなのかよくわかりません。OSに依存させているというのは、けっこう出たとこ勝負ではないでょうか。
 
テストを実施してみました。
Activity から Service を呼び、AlarmManager にそれぞれのメソッドをセットします
アラーム起動は1秒後で、その後1分間隔で繰り返すテストです
Nexus7 2013 を使用
またスマホはwakeupの状態
targetSdkVersion = 25 です
 

setRepeating

 

相当ばらついています
1分間隔ですが24秒後にアラームが出てることもあります
 
alarm inexact 1 300x112 - [Android] setRepeating() の誤差と setExact()  setWindow()
 

set

 
setは単発アラームなので、Serviceでアラーム起動後、次のアラームを設定する方法をとりました

 
毎回設定しているためか、setRepeating よりはマシですが
時々ズレます
 
alarm inexact 2 300x116 - [Android] setRepeating() の誤差と setExact()  setWindow() 

setExact

 

 
setExact のReferenceでは
http://developer.android.com/reference/android/app/AlarmManager.html#setExact(int, long, android.app.PendingIntent)

This method is like set(int, long, PendingIntent), but does not permit the OS to adjust the delivery time. The alarm will be delivered as nearly as possible to the requested trigger time.

ということで、努力目標でしょうか
CPUに負荷がかかってしまうと確実ではないような感じですね
 
alarm inexact 3 300x116 - [Android] setRepeating() の誤差と setExact()  setWindow()
 

setWindow

 
 
window の幅は 1000 msec に設定
 

 
SetWindow のReferenceでは
http://developer.android.com/reference/android/app/AlarmManager.html#setWindow(int, long, long, android.app.PendingIntent)

Schedule an alarm to be delivered within a given window of time. This method is similar to set(int, long, PendingIntent), but allows the application to precisely control the degree to which its delivery might be adjusted by the OS.

windowの範囲内であればOSが調整してくれる(たぶん)
ということですね
 
alarm inexact 4 300x114 - [Android] setRepeating() の誤差と setExact()  setWindow()
 
window の範囲内でアラームが出ていますが
繰り返しによる遅れがだんだん積み重なっています
setWindow、setExact 以外に繰り返しのAPIがないようです

x setExactRepeatingというのが無い

setWindowがとりあえず、バッテリー消費と時間精度の妥協策でしょうか

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加

 

アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

オンラインスクールは色々ありますが、以下の3つはAndroidが学習できる老舗スクールです。


TECH ACADEMY
Androidアプリコース


こういうものではアプリ作れないと言う意見もありますが、それは結局本人のやる気があるかないかです。やる気があっても独学では突破しにくいところは教えてもらうのが一番早い。


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


CodeCamp
~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp




直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。


無料で転職まで
これはアプリ限定ではありませんが無料です
その代わり就職することを前提にしたスクールでエンジニアになって職を得たいのであれば手っ取り早いかもしれません

受講料無料:社会人転職コース




シェアする

  • このエントリーをはてなブックマークに追加

フォローする