Android - 시간, 날짜 변경 이벤트 받기

안드로이드는 날짜, 시간이 변경될 때 앱에게 인텐트를 전달합니다.

사용자가 직접 시간 설정을 변경하거나, 시스템에 의해서 변경될 때 다음 인텐트가 전달됩니다. 즉, 이 인텐트를 받으면 시간 설정이 변경된 것을 감지할 수 있습니다.

  • ACTION_TIME_CHANGED
  • ACTION_TIMEZONE_CHANGED

시간이 흘러 Time이나 Date가 변경될 때는 다음 인텐트가 전달됩니다. 즉, 이 인텐트를 받으면 시간이 지났는지 인식할 수 있습니다.

  • ACTION_TIME_TICK
  • ACTION_DATE_CHANGED

각각의 인텐트에 대해서 예제와 함께 알아보겠습니다.

ACTION_TIME_CHANGED

ACTION_TIME_CHANGED는 시스템의 시간 또는 날짜가 변경될 때 전달됩니다. 사용자가 직접 Settings 앱에서 날짜와 시간을 변경해도 이 인텐트가 전달됩니다.

여기서 시간, 날짜 변경의 의미는 시간이 지나서 변경된 것이 아니라, 시스템 또는 사용자에 의해서 시간, 날짜 설정이 변경되었다는 것을 의미합니다.

다음과 같이 인텐트를 받을 수 있습니다.

val intentFilter = IntentFilter(Intent.ACTION_TIME_CHANGED)

val receiver = object: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("Test", "receive : ${intent.action}")
    }
}

Output:

12-25 10:03:51.128 16239 16239 D Test    : receive : android.intent.action.TIME_SET

참고로, Intent.ACTION_TIME_CHANGED의 문자열은 "android.intent.action.TIME_SET"으로 정의되어있기 때문에 Action을 출력해보면 TIME_SET으로 출력됩니다.

/**
 * Broadcast Action: The time was set.
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";

ACTION_TIMEZONE_CHANGED

Time Zone이 변경될 때 ACTION_TIMEZONE_CHANGED 인텐트가 전달됩니다. 예를 들어, 사용자가 Settings 앱에서 Time Zone을 미국에서 영국으로 변경하면 이 인텐트가 전달됩니다.

val intentFilter = IntentFilter(Intent.ACTION_TIMEZONE_CHANGED)

val receiver = object: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("Test", "receive : ${intent.action}")
    }
}

Output:

12-24 14:48:06.800 16239 16239 D Test    : receive : android.intent.action.TIMEZONE_CHANGED

ACTION_TIME_TICK

ACTION_TIME_TICK 인텐트는 시간이 변경될 때 전달되며, 1분마다 전달하고 있습니다.

val intentFilter = IntentFilter(Intent.ACTION_TIME_TICK)

val receiver = object: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("Test", "receive : ${intent.action}")
    }
}

위 코드를 실행해보면 1분마다 ACTION_TIME_TICK 인텐트가 전달되는 것을 볼 수 있습니다.

12-24 09:57:00.007 14833 14833 D Test    : receive : android.intent.action.TIME_TICK
12-24 09:58:00.017 14833 14833 D Test    : receive : android.intent.action.TIME_TICK
12-24 09:59:00.188 14833 14833 D Test    : receive : android.intent.action.TIME_TICK
12-24 10:00:00.013 16239 16239 D Test    : receive : android.intent.action.TIME_TICK

ACTION_DATE_CHANGED

ACTION_DATE_CHANGED 인텐트는 날짜가 변경될 때 전달됩니다. 예를 들면, 11:59 PM에서 1분이 지나 00:00 AM이 되면 날짜가 변경되는데, 이 때, 이 인텐트가 전달됩니다.

val intentFilter = IntentFilter(Intent.ACTION_DATE_CHANGED)

val receiver = object: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("Test", "receive : ${intent.action}")
    }
}

Settings 앱에서 시간을 11:59 PM으로 변경하고 1분을 기다리면 인텐트가 전달되는 것을 확인할 수 있습니다.

12-25 00:00:00.412 13074 13074 D Test    : receive : android.intent.action.DATE_CHANGED
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha