상세 컨텐츠

본문 제목

[안드로이드 코틀린] 정해진 시간에 알람 울리는 방법 Notification TimePickerDialog part3 - 알림 시간 표시

안드로이드

by aries574 2022. 6. 19. 12:08

본문


이번 시간에는 알림 창의 내용을 사용자가 선택한 시간이 보여지도록 데이터 전달하는 방법을 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.


목차

1. 실행 화면
2. 메인 코드 수정 MainActivity.kt
3. 리시브 클래스 수정 AlertReceiver.kt
4. 알람 클래스 수정 NotificationHelper.kt


1. 실행 화면


2. 메인 코드 수정 MainActivity.kt

 - 설명 - 

1. intent.putExtra("time", curTime)

 intent를 전달할 때, 데이터(시간)도 담아서 전달한다. 

class MainActivity : AppCompatActivity(), TimePickerDialog.OnTimeSetListener {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //binding 초기화
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)

        //알람 설정
        binding.timeBtn.setOnClickListener {

            var timePicker = TimePickerFragment()
            //시계 호출
            timePicker.show(supportFragmentManager, "Time Picker")
        }

        //알람 취소
        binding.alarmCancelBtn.setOnClickListener {
            // 알람 취소 함수
            cancleAlarm()
        }
    }

    //시간 정하면 호출되는 함수
    override fun onTimeSet(timePicker: TimePicker?, hourOfDay: Int, minute: Int) {

        var c = Calendar.getInstance()

        //시간 설정
        c.set(Calendar.HOUR_OF_DAY, hourOfDay) //시
        c.set(Calendar.MINUTE, minute)//분
        c.set(Calendar.SECOND, 0)//초

        //화면에 시간 지정
        updateTimeText(c)

        //알람 설정
        startAlarm(c)
    }

    //화면에 시간 지정
    private fun updateTimeText(c: Calendar) {

        var curTime = DateFormat.getTimeInstance(DateFormat.SHORT).format(c.time)

        binding.timeText.append("알람 시간: ")
        binding.timeText.append(curTime)
    }

    //알람 설정
    private fun startAlarm(c: Calendar){

        //알람매니저 선언
        var alarmManager: AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

        var intent = Intent(this, AlertReceiver:: class.java)

        //데이터 담기
        var curTime = DateFormat.getTimeInstance(DateFormat.SHORT).format(c.time)
        intent.putExtra("time", curTime)

        var pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0)

        //설정 시간이 현재시간 이전이면 +1일
        if(c.before(Calendar.getInstance())){

            c.add(Calendar.DATE, 1)
        }

        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.timeInMillis, pendingIntent)
    }

    //알람 취소
    private fun cancleAlarm(){

        //알람매니저 선언
        var alarmManager: AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

        var intent = Intent(this, AlertReceiver:: class.java)

        var pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0)

        alarmManager.cancel(pendingIntent)
        binding.timeText.text = "알람 취소"

    }
}

 

 

3. 리시브 클래스 수정 AlertReceiver.kt

 - 설명 - 

 1. var time = intent?.extras?.getString("time")

     notificationHelper.getChannelNotification(time)

    intent에 담긴 데이터를 꺼내 getChannelNotification 함수에 전달한다.

class AlertReceiver: BroadcastReceiver(){

    override fun onReceive(context: Context?, intent: Intent?) {

        var notificationHelper: NotificationHelper = NotificationHelper(context)

        //넘어온 데이터
        var time = intent?.extras?.getString("time")

        var nb: NotificationCompat.Builder = notificationHelper.getChannelNotification(time)

        //알림 호출
        notificationHelper.getManager().notify(1, nb.build())
    }
}


4. 알람 클래스 수정 NotificationHelper.kt

 - 설명 -

1. getChannelNotification(time: String?)

    . setContentTitle(time)

2. 리시브에서 전달한 데이터를 파라미터 추가해서 전달받아 제목 설정 부분에 넣어준다.

class NotificationHelper(base: Context?) : ContextWrapper(base) {

    private val channelID = "channelID"
    private val channelNm = "channelNm"

    init {
        //안드로이드 버전이 오레오거나 이상이면 채널 생성
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){

            //채널 생성
            createChannel()
        }
    }

    //채널 생성
    private fun createChannel(){
        var channel = NotificationChannel(channelID, channelNm,
        NotificationManager.IMPORTANCE_DEFAULT)

        channel.enableLights(true)
        channel.enableVibration(true)
        channel.lightColor = Color.GREEN
        channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE

        getManager().createNotificationChannel(channel)
    }

    //NotificationManager 생성
    fun getManager(): NotificationManager{

        return getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    }

    //notification 설정
    fun getChannelNotification(time: String?):NotificationCompat.Builder{

        return NotificationCompat.Builder(applicationContext, channelID)
            .setContentTitle(time)
            .setContentText("알람입니다.")
            .setSmallIcon(R.drawable.ic_launcher_background)
    }
}

2022.06.06 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

이번 시간부터 코틀린 버전 커스텀 달력을 만들어보겠습니다. 이번 포스팅은 화면 구성입니다. 목차 1. 실행 화면 2. dataBinding 설정 3. 메인 화면 구성 activity_main.xml 1. 실행 화면 2. dataB..

aries574.tistory.com

2022.06.14 - [안드로이드] - [안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

 

[안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

앞으로 TabLayout을 직접 만들어 애니메이션 기능까지 넣어보도록 하겠습니다. 이번 시간에는 화면 구성 및 설정을 만들어 보겠습니다. 목차 1. 실행 화면 2. dataBinding 설정 build.gradle 3. 테마 변경 t

aries574.tistory.com

2022.05.24 - [안드로이드] - [안드로이드 코틀린] 조건문 when 만드는 방법

 

[안드로이드 코틀린] 조건문 when 만드는 방법

이번 시간에는 조건문에 쓰이는 when문 만드는 방법에 대하여 알아보겠습니다. 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java 1. 실행 화면 2. 메인 화..

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역