Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

훌륭한 개발자가 되기 위하여

[Android | Kotlin] 시스템 상태 파악하기 본문

안드로이드

[Android | Kotlin] 시스템 상태 파악하기

jay20033 2023. 12. 28. 18:16

시스템에 발생하는 인텐트는 여러 종류가 있으며 부팅 완료, 화면 켬/끔, 배터리 상태 등이 있습니다.

부팅 완료

부팅이 완료되면 시스템에서는 android.intent.action.BOOT_COMPLETED라는 액션 문자열을 포함하는 인텐트가 발생합니다. 그런데 리시버를 실행하려면 권한이 필요하므로 매니페스트 파일에 퍼미션을 추가해야 합니다.

<receiver android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

화면 켬 / 끔

  • 화면을 켜거나 끄는 상황을 감지하는 브로드캐스트는 매니페스트에 등록하면 실행되지 않습니다.
  • regeisterReceiver( ) 함수를 이용해 동적으로 등록해야 합니다.
  • android.intent.action.SCREEN_ON과 android.intent.action.SCREEN_OFF 액션 문자열 사용
// 화면 켬/끔 리시버
receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            Intent.ACTION_SCREEN_ON -> Log.d("kim", "screen on")
            Intent.ACTION_SCREEN_OFF -> Log.d("kim", "screen off")
        }
    }
}
// 리시버 등록
val filter = IntentFilter(Intent.ACTION_SCREEN_ON).apply {
    addAction(Intent.ACTION_SCREEN_OFF)
}
registerReceiver(receiver, filter)

배터리 상태

안드로이드 시스템에서 배터리 상태가 변경되면 다음 액션 문자열로 인텐트가 발생

  • BATTERY_LOW : 배터리가 낮은 상태로 변경되는 순간
  • BATTERY_OKAY : 배터리가 정상 상태로 변경되는 순간
  • BATTERY_CHANGED : 충전 상태가 변경되는 순간
  • ACTION_POWER_CONNECTED : 전원이 공급되기 시작한 순간
  • ACTION_POWER_DISCONNECTED : 전원 공급을 끊은 순간
// 배터리 상태 리시버
receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (Intent?.action) {
            Intent.ACTION_BATTERY_OKAY -> Log.d("kim", "ACTION_BATTERY_OKAY")
            Intent.ACTION_BATTERY_LOW -> Log.d("kim", "ACTION_BATTERY_LOW")
            Intent.ACTION_BATTERY_CHANGED -> Log.d("kim", "ACTION_BATTERY_CHANGED")
            Intent.ACTION_POWER_CONNECTED -> Log.d("kim", "ACTION_POWER_CONNECTED")
            Intent.ACTION_POWER_DISCONNECTED -> Log.d("kim", "ACTION_POWER_DISCOMECTED")
        }
    }
}

배터리 정보

// 시스템 인텐트 없이 배터리 상태 파악하기
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val batteryStatus = registerReceiver(null, intentFilter)
// 인텐트의 엑스트라를 이용해 배터리 상태 파악하기
val status = batteryStatus!!.getIntExtra(BatteryManager.EXTRA_STATUS,-1)
if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
    // 전원이 공급되고 있다면
    val chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1)
    when (chargePlug) {
        BatteryManager.BATTERY_PLUGGED_USB -> Log.d("kim", "usb charge")
        BatteryManager.BATTERY_PLUGGED_AC -> Log.d("kim", "ac charge")
    }
} else {
    // 전원이 공급되고 있지 않다면
    Log.d("kim", "not charging")
}

배터리가 얼마나 충전되었는지 알고 싶은 경우

// 배터리 충전량을 퍼센트로 출력
val level = batteryStatus.getInExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = batteryStatus.getInExtra(BatteryManager.EXTRA_SCALE, -1)
val batteryPct = level / scale.toFloat() * 100
Log.d("kim", "batteryPct : $batteryPct")