[Android] 다양한 유저 알림효과

leeeha·2022년 10월 12일
0
post-thumbnail

Vibration

  • 퍼미션 필요: <uses-permission android:name="android.permission.VIBRATE"/>
  • API Level 31 이전 버전에서는 Vibrator라는 시스템 서비스 이용
  • API Level 31 버전부터는 VibratorManager라는 시스템 서비스 이용

  • API Level 26 이전 버전에서 사용되던 함수
    • open fun vibrate(milliseconds: Long): Unit
    • open fun vibrate(pattern: LongArray!, repeat: Int): Unit
  • API Level 26 버전부터 사용되는 함수
    • open fun vibrate(vibe: VibrationEffect!): Unit
  • VibrationEffect 객체 획득 방법
    • open static fun createOneShot(milliseconds: Long, amplitude: Int) VibrationEffect!
    • open static fun createWaveform(timings: LongArray!, amplitudes: IntArray!, repeat: Int): VibrationEffect!


Beep

  • 시스템에 등록된 알림음 플레이
  • 시스템에는 알림(NOTIFICATION), 알람(ALARM), 링톤(RINGTONE) 등의 음이 준비되어 있다.

  • 임의의 음원을 Beep로 사용하고 싶다면, raw 폴더 이용

  • 음원 및 영상을 재생할 때 사용되는 MediaPlayer


실습 예제

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutorial.c52">

    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AndroidLab">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.kt

package com.tutorial.c52

import android.content.Context
import android.media.RingtoneManager
import android.net.Uri
import android.os.*
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

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

        val vibButton = findViewById<Button>(R.id.vibration)
        val beepButton = findViewById<Button>(R.id.beep)

        vibButton.setOnClickListener {
            val vibrator = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ // api level 31 이상
                val vibManager = this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
                vibManager.defaultVibrator
            }else{
                getSystemService(VIBRATOR_SERVICE) as Vibrator
            }

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ // api level 26 이상
                vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE))
            }else {
                vibrator.vibrate(500)
            }
        }

        beepButton.setOnClickListener {
            val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
            val ringtone = RingtoneManager.getRingtone(applicationContext, uri)
            ringtone.play()
        }
    }
}

Toast

  • 화면 하단에 잠깐 보였다가 사라지는 문자열
  • open static fun makeText(context: Context!, text: CharSequence!, duration: Int): Toast!
  • open static fun makeText(context: Context!, resId: Int, duration: Int): Toast!
  • val LENGTH_LONG: Int
  • val LENGTH_SHORT: Int


Dialog

AlertDialog

https://developer.android.com/reference/android/app/AlertDialog

  • 안드로이드 다이얼로그의 기본
  • 단순히 문자열만 출력할 수도 있고, 다양한 화면을 출력할 수도 있다.
  • AlertDialog의 화면은 title, content, button 영역으로 구분

  • AlertDialog.Builder를 생성하고 Builder의 setter 함수를 이용해 다이얼로그의 정보를 지정
  • open fun setIcon(iconId: Int): AlertDialog.Builder!
  • open fun setTitle(title: CharSequence!): AlertDialog.Builder!
  • open fun setMessage(message: CharSequence!): AlertDialog.Builder!
  • 버튼은 최대 3개까지만 추가 가능
  • open fun setPositiveButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  • open fun setNegativeButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  • open fun setNeutralButton(text: CharSequence!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  • 목록을 제공하는 다이얼로그
  • open fun setItems(items: Array<CharSequence!>!, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!
  • open fun setMultiChoiceItems(items: Array<CharSequence!>!, checkedItems: BooleanArray!, listener: DialogInterface.OnMultiChoiceClickListener!): AlertDialog.Builder!
  • open fun setSingleChoiceItems(items: Array<CharSequence!>!, checkedItem: Int, listener: DialogInterface.OnClickListener!): AlertDialog.Builder!

DatePickerDialog

  • 날짜를 입력 받기 위해 제공되는 다이얼로그
  • DatePickerDialog(context: Context, listener: DatePickerDialog.OnDateSetListener?, year: Int, month: Int, dayOfMonth: Int)

TimePickerDialog

  • 시간을 입력 받기 위해 제공되는 다이얼로그
  • TimePickerDialog(context: Context, TimePickerDialog.OnTimeSetListener!, hourOfDay: Int, minute: Int, is24HourView: Boolean)


실습 예제

package com.tutorial.c53

import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.DialogInterface
import android.os.Bundle
import android.widget.Button
import android.widget.DatePicker
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity

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

        val alertDialog = findViewById<Button>(R.id.alertDialog)
        val listDialog = findViewById<Button>(R.id.listDialog)
        val dateDialog = findViewById<Button>(R.id.dateDialog)
        val timeDialog = findViewById<Button>(R.id.timeDialog)

        alertDialog.setOnClickListener {
            AlertDialog.Builder(this).run {
                setTitle("test dialog")
                setIcon(android.R.drawable.ic_dialog_alert)
                setMessage("정말 종료하시겠습니까?")
                setPositiveButton("OK", null)
                setNegativeButton("Cancel", null)
                show()
            }
        }

        listDialog.setOnClickListener {
            val items = arrayOf("사과", "복숭아", "수박")
            AlertDialog.Builder(this).run {
                setTitle("items test")
                setItems(items, object: DialogInterface.OnClickListener{
                    override fun onClick(p0: DialogInterface?, pos: Int) {
                        Toast.makeText(this@MainActivity,
                            "선택한 항목: ${items[pos]}", Toast.LENGTH_SHORT).show()
                    }
                })
                setPositiveButton("OK", null)
                show()
            }
        }

        dateDialog.setOnClickListener {
            DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
                override fun onDateSet(p0: DatePicker?, year: Int, month: Int, day: Int) {
                    Toast.makeText(this@MainActivity,
                        "${year}, ${month + 1}, ${day}", Toast.LENGTH_SHORT).show()
                }
            }, 2022, 10, 12).show()
        }

        timeDialog.setOnClickListener {
            TimePickerDialog(this, object: TimePickerDialog.OnTimeSetListener{
                override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {
                    Toast.makeText(this@MainActivity,
                        "$p1, $p2", Toast.LENGTH_SHORT).show()
                }
            }, 0, 0, true).show()
        }
    }
}

profile
습관이 될 때까지 📝

0개의 댓글