π‘μ°μνν κ·Έμ½μ€ λ―Έμ μ μ§ννλ©΄μ νμ©ν AlarmManagerμ λν΄μ μμΈνκ² κΈ°λ‘νμμ΅λλ€!
AlarmManger
- AlarmManagerλ Androidμμ νΉμ μκ°μ μμ μ μμ½νκ³ μ€νν μ μλλ‘ λμμ£Όλ μλΉμ€μ λλ€.
- μ±μ΄ λ°±κ·ΈλΌμ΄λ μνμ΄κ±°λ μ’ λ£λ μνμμλ μ§μ λ μκ°μ μμ μ μ€νν μ μμ΅λλ€.
- μ ν΄μ§ μκ°μ μλ¦Όμ 보λ΄κ±°λ, μ£ΌκΈ°μ μΈ μμ μ μ²λ¦¬ν λ μ¬μ©ν©λλ€.
νΉμ§
- μ ν΄μ§ μκ°μ μμ
μ€ν
- νΉμ μκ°μ ν λ² μμ μ μ€ννκ±°λ, μ£ΌκΈ°μ μΌλ‘ λ°λ³΅λλ μμ μ μμ½ν μ μμ΅λλ€.
- λ°±κ·ΈλΌμ΄λμμ μ€ν
- μ±μ΄ μ€ν μ€μ΄μ§ μλλΌλ μλμ μ€νν μ μμ΅λλ€.
- μ μ λͺ¨λμμ μ€ν κ°λ₯
- AlarmManagerλ μ μ λͺ¨λμμλ μ€νλλλ‘ μ€μ ν μ μμ΅λλ€.
- λ°°ν°λ¦¬ ν¨μ¨μ±
- Doze λͺ¨λ(μ μκΈ°)λ μ± λκΈ° λͺ¨λμμ μλμ΄ μ§μ°λκ±°λ μ€νλμ§ μλλ‘ μ€μ ν μ μμ΅λλ€.
- Android API 23λΆν° λμ λ λͺ¨λμμλ AlarmManagerκ° λμνμ§ μμ΅λλ€.
- Doze λͺ¨λ(μ μκΈ°)λ μ± λκΈ° λͺ¨λμμ μλμ΄ μ§μ°λκ±°λ μ€νλμ§ μλλ‘ μ€μ ν μ μμ΅λλ€.
PendingIntent
- Pendingμ 보λ₯μ€μ΄λΌλ λ»μΌλ‘ μ§κΈ λΉμ₯ μ¬μ©νμ§ μκ³ , μΆν νΉμ μ΄λ²€νΈμμ λ°λλλ intentμ λλ€.
- μΈλΆ μ ν리μΌμ΄μ μ κΆνμ νκ°νμ¬ μμ λ€μ΄μλ Intentλ₯Ό λ§μΉ λ³ΈμΈ μ±μ νλ‘μΈμ€μμ μ€ννλ κ²μ²λΌ μ¬μ©νκ² νλ©° λ€λ₯Έ μ»΄ν¬λνΈμ μμμ μ²λ¦¬νλ κΈ°λ₯μ λλ€.
- μ£Όλ‘ AlarmManagerμ ν¨κ» μ¬μ©ν©λλ€.
μλ λ±λ‘
μΌνμ± μλ
- νΉμ μκ°μ ν λ² μ€νλλ μλμ λ±λ‘νμμ΅λλ€.
- PendingIntentλ₯Ό νμ©νμ¬ μλμ΄ λ°μν λ μνν μμ μ μ μν©λλ€.
- μλμ΄ λ°μνλ©΄ AlarmManager.RTC_WAKEUPλ₯Ό ν΅ν΄ κΈ°κΈ°λ₯Ό κΉ¨μ°κ³ , setExact()λ₯Ό ν΅ν΄ μ§μ λ μκ°μ ν λ²λ§ μ€ννλ μλμ λ±λ‘ν©λλ€.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// AlarmManagerκ° μ€νν PendingIntent
val intent = Intent(this, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
// μλμ μ€μ ν μκ° (νμ¬ μκ° + 10μ΄)
val triggerTime = System.currentTimeMillis() + 10 * 1000
// μΌνμ± μλ μ€μ
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent)
λ°λ³΅ μλ
- setRepeating()μ ν΅ν΄ λ°λ³΅ μ€νλλ μλμ μ€μ ν©λλ€.
- AlarmManager.INTERVAL_FIFTEEN_MINUTESλ₯Ό νμ©ν΄ μλμ λ°λ³΅ μ€ννλλ‘ μ€μ ν©λλ€.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// AlarmManagerκ° μ€νν PendingIntent
val intent = Intent(this, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
// μλμ μ€μ ν μκ° (5λΆλ§λ€ λ°λ³΅)
val interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES
val triggerTime = System.currentTimeMillis() + interval
// λ°λ³΅ μλ μ€μ
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent)
- λ°λ³΅ μλμ λ°°ν°λ¦¬ ν¨μ¨ λ¬Έμ λ‘ κΆμ₯νμ§ μμ΅λλ€.
- setExact()λ setExactAndAllowWhileIdle() λ±μ μ μ νκ² νμ©νλ λ°©μλ μ’μ΅λλ€.
μ νν μλ
- setExactAndAllowWhileIdle()λ₯Ό νμ©ν΄μ Doze λͺ¨λλ μ± λκΈ° λͺ¨λμμλ μ νν μλμ λ³΄λΌ μ μμ΅λλ€.
- μ΄ λ©μλλ μμ€ν μ΄ μ μ λͺ¨λμΌ λλ μλμ΄ μ ννκ² μ€νλλλ‘ ν©λλ€.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
// μ νν μκ°μ μλ μ€μ
val triggerTime = System.currentTimeMillis() + 10 * 1000
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent)
μλ ν΄μ
- cancel() λ©μλλ₯Ό μ¬μ©νμ¬ μλμ μ€μ ν λ μ¬μ©νλ PendingIntentμ λμΌν κ²μ μ λ¬ν μ μμ΅λλ€.
// μλ μ·¨μ
alarmManager.cancel(pendingIntent)
BroadcastReceiverμ μ¬μ©
- BroadcastReceiverλ μλμ΄ λ°μνμ λ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ λ° μ¬μ©λ©λλ€.
- AlarmManagerλ‘ μ€μ λ μλμ΄ λ°μνλ©΄, μμ€ν μ PendingIntentλ₯Ό ν΅ν΄ μ€μ λ BroadcastReceiverλ₯Ό νΈμΆν©λλ€.
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// μλ λ°μ μ μ²λ¦¬ν μμ
Toast.makeText(context, "Alarm Triggered!", Toast.LENGTH_SHORT).show()
}
}
μ 리
- AlarmManagerλ μλλ‘μ΄λμμ μ§μ λ μκ°μ μμ μ μμ½νκ³ , μ±μ΄ λ°±κ·ΈλΌμ΄λμμ μ€ν μ€μΌ λλ μμ μ μνν μ μλλ‘ λμμ€λλ€.
- Doze λͺ¨λλ λ°°ν°λ¦¬ μ¬μ©λμ μ£Όμν΄μΌνλ©°, μΌμ ν κ°κ²©μΌλ‘ λ°λ³΅λλ μμ μ μ²λ¦¬ν λλ WorkManagerκ° μ ν©ν μλ μμ΅λλ€.
[Android, Kotlin] WorkMangerλ‘ λ§€μΌ νΉμ μκ°μ λ°±κ·ΈλΌμ΄λ μμ μ€ν
WorkManagerλ₯Ό μ¬μ©ν λ°±κ·ΈλΌμ΄λ μμ - Kotlin | Android Developers