버튼 클릭을 할 때 TimePicker에서 설정한 시간에 맞춰서 작업이 실행되도록 하시려는 거죠? 이걸 scheduliing이라고 하는데, 버튼 클릭을 할 때 바로 작업을 실행하는 것이 아니라 사용자가 입력한 시간을 가지고 작업을 돌릴 수 있도록 설정해야 합니다.
안드로이드에서는 API레벨에 따라 권장하는 방법이 바뀌어 왔는데요, 최근에 권장하는 방법은 WorkManager입니다.
https://developer.android.com/topic/libraries/architecture/workmanager(한글버전도 있을 겁니다.)
아니면 AlarmManager를 이용해도 될 겁니다. scheduling을 하는 코드는 너무 많이 나와 있어서 구글로 간단히 검색하면 엄청 많은 결과가 나올 겁니다. 위에서 말씀드린 링크에도 예제가 있고 구글의 Github page (https://github.com/android)에도 예제를 찾으실 수 있을 겁니다. 일단 개발자 문서도 좀 참조하시고 샘플들도 확인하셔서 처리해 보시기 바랍니다. 기본적으로 scheduling이 어떻게 돌아가는지 이해를 하지 않으시면 추후에 문제가 있거나 할 때 해결이 힘들어 지니 기본 문서는 확인하시고 진행하시기 바랍니다.
int startHour, startMinute, endHour, endMinute;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
startHour = tp_start_time.getHour();
startMinute = tp_start_time.getMinute();
endHour = tp_end_time.getHour();
endMinute = tp_end_time.getMinute();
} else {
startHour = tp_start_time.getCurrentHour();
startMinute = tp_start_time.getCurrentMinute();
endHour = tp_end_time.getCurrentHour();
endMinute = tp_end_time.getCurrentMinute();
}
Calendar startCalendar = getCalendar(startHour, startMinute);
Calendar endCalendar = getCalendar(endHour, endMinute);
scheduleMuteWork(startCalendar.getTimesInMills() - System.currentTimeMillis())
scheduleUnmuteWork(endCalendar.getTimesInMills() - System.currentTimeMillis())
private static Calendar getCalendar(int hour, int minute) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
return calendar;
}
참고로 WorkManager로 Scheduling을 하는 샘플코드인데 제가 요즘은 코틀린만 사용하기 때문에 WorkManager 관련코드는 코틀린으로 작성하였습니다. 제 코드가 급하게 작성한 코드라 좋은 코드라고 하긴 그렇고 이런 식으로 한다만 참고하시고 코드는 공부를 하셔서 님이 직접 작성하시면 좋을 것 같습니다.
class MuteWorker(
appContext: Context,
workerParams: WorkerParameters
) : Worker(appContext, workerParams) {
override fun doWork(): Result {
// 무음으로 만드는 코드
return Result.success()
}
}
class UnmuteWorker(
appContext: Context,
workerParams: WorkerParameters
) : Worker(appContext, workerParams) {
override fun doWork(): Result {
//원래대로 돌리는 코드
return Result.success()
}
}
private fun scheduleMuteWork(initialDelayInMills: Long) {
WorkManager.getInstance(this).enqueue(muteWorkRequest(initialDelayInMills))
}
private fun muteWorkRequest(initialDelayInMills: Long): WorkRequest {
return OneTimeWorkRequestBuilder<MuteWorker>()
.setInitialDelay(initialDelayInMills, TimeUnit.MILLISECONDS)
.addTag("MuteWork")
.build()
}
private fun scheduleUnmuteWork(initialDelayInMills: Long) {
WorkManager.getInstance(this).enqueue(unmuteWorkRequest(initialDelayInMills))
}
private fun unmuteWorkRequest(initialDelayInMills: Long): WorkRequest {
return OneTimeWorkRequestBuilder<UnmuteWorker>()
.setInitialDelay(initialDelayInMills, TimeUnit.MILLISECONDS)
.addTag("UnmuteWork")
.build()
}