元情報は公式サイトから。

http://developer.android.com/reference/android/os/SystemClock.html


Androidでは3種類の時間が利用できる。
特徴を箇条書きする。



1.Systrem.currentTimeMillis()
・"wall"時間(日付情報も含む)である。http://en.wikipedia.org/wiki/Wall-clock_time
・俗に言うUNIX時間(エポック時間、epoch)を表す。つまり、1970年1月1日午前0時0分0秒からの経過秒数の数値を示す。
・ミリ秒(milliseconds)で表現される。
・ユーザやネットワークから取得した時間を設定することができるので、予期せず未来や過去の時間を示すこともある
・この時間は現実世界の時間が重要な時のみに使われるべきである。たとえばカレンダー、アラームなど。インターバル(間隔)や経過時間を計算する際は別の時刻を使うべきである。
・これを使うなら、"ACTION_TIME_TICK", "ACTION_TIME_CHANGED", "ACTION_TIMEZONE_CHANGED" といったインテントからのブロードキャストをキャッチして、時間が変わったことを検知して対応することをお勧めする。



2.uptimeMillis()
・システムが起動してからの時間を示す。
・ミリ秒(milliseconds)で表される。
・システムがディープスリープに入るとこの時間カウントも停止するので注意。(ここでいうディープスリープとは、CPUがオフになり、ディスプレイが暗くなり、デバイスが外部入力待ちの状態)
・CPU周波数スケーリング(clock scaling)、アイドル状態、その他節電の仕組みには影響されない。
・Thread.sleep()、Object.wait()、System.nanoTime()のような間隔やタイミングを扱うメソッドの基本時間として使われる。
・モノトニック(Monotonic)である。つまり単調増加が保証され、時間が巻き戻ったり調整されない時間数値である。
・デバイスがスリープしたりしない時の間隔やタイミングを計りたいときに適した時間である。



3.elapsedRealtime(), elapsedRealtimeNanos()
・システムが起動してからの時間を表す。
・"uptimeMillis()"との違いは、ディープスリープしている間の時間も計測する点にある。
・"uptimeMillis()"と同様、モノトニックな時間である。
・CPUが省電力状態でもカウントし続けるため、様々な目的の時間計測に有効である。



その他注釈:
・Thread.sleep(millis)やObject.wait(millis)はuptimeMillis()を使用しているため、デバイスがスリープに入るとスリープが解除されるまで通知が延期される。これらの同期機能は、Thread.interrupt()を使うことで中断することができるが、その際はInterruptedExceptionをハンドルする必要がある。
・SystemClock.sleep(millis)はThread.sleep(millis)とよく似たメソッドだが、SystemClock.sleep()はInterruptedException(割り込み例外)を無視する点が異なる。そのため、Thread.interrupt()を使わず、SystemClock.sleep()を使用すると、スレッドの割り込み状態を保持しておくことができる。
・Handlerクラスは内部的にuptimeMillis()を使用している。Handlerクラスは絶対時間あるいは相対時間で同期のためのコールバックをスケジューリング(予約)することができ、GUI処理でよく使われるイベントループに使われる。
・AlarmManagerは、ディープスリープ状態やアプリが起動していない状態でもイベントのトリガとして使用することができる。RTC:currentTimeMillis()やELAPSED_REALTIME:elapsedRealtime()、インテントのブロードキャストが起こった際にイベントが発生する。