[Android][study] 브로드캐스트 리시버 컴포넌트- 2

Intelli·2022년 11월 28일
0

이 글은 『Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린』교재를 바탕으로 작성되었습니다.

14 - 2 시스템 상태 파악하기


1. 부팅 완료

  • 기기의 부팅이 완료되었을 때, 특정한 작업을 수행하고 싶다면 다음의 과정을 수행한다.

🥞 1. 브로드캐스트 리시버 만들기

class MyReceiver: BroadcastReceiver() {
	override fun onReceive(context: Context, intent: Intent){
    	//기기의 부팅이 완료되었을 때 수행하고 싶은 작업 작성
    }
}

🍩 2. 브로드캐스트 리시버와 인텐트 필터를 등록

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

🧁 3. 권한 설정

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">

2. 화면 켬/끔

  • 화면을 켜거나 끄는 상황을 감지하는 브로드캐스트 리시버는 동적으로 등록해야만 실행이 가능하다.

🥝 1. 화면을 켜거나 끌 때 이를 감지하는 리시버 객체 생성

val receiver = object: BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) {
    	when(intent?.action) { //화면이 켜지거나 꺼졌을 때 이하 작동
        	Intent.ACTION_SCREEN_ON -> Log.d("kkang", "screen on")
            Intent.ACTION_SCREEN_OFF -> Log.d("kkang", "screen off")
        }
    }
}

🍉 2. 인텐트 필터 객체 생성 및 리시버 등록

	val filter = IntentFilter(Intent.ACTION_SCREEN_ON).apply {
    	addAction(Intent.ACTION_SCREEN_OFF)
    }//화면이 꺼지거나 켜질 때
    //BroadcastReceiver가 실행된다는 정보를 담은 인텐트 필터
    registerReceiver(receiver, filter)

🍒 3. 리시버 등록 해제

unregisterReceiver(receiver)

3. 배터리 상태

🍸 1. 배터리 상태 리시버 객체 생성

val receiver = object:BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) {
    	when(intent?.action) {
        	Intent.ACTION_BATTERY_OKAY -> Log.d("kkang", "ACTION_BATTERY_OKAY")
            Intent.ACTION_BATTERY_LOW -> Log.d("kkang", "ACTION_BATTERY_LOW")
            Intent.ACTION_BATTERY_CHANGED -> Log.d("kkang", "ACTION_BATTERY_CHANGED")
            Intent.ACTION_POWER_CONNECTED -> Log.d("kkang", "ACTION_POWER_CONNEDCTED")
            Intent.ACTION_POWER_DISCONNECTED -> Log.d("kkang", "ACTION_POWER_OKAY")
        }
    }
}

🍹 2. 인텐트 필터 객체 생성 및 리시버 등록

val filter = IntentFilter(Intent.ACTION_BATTERY_LOW).apply {
	addAction(Intent.ACTION_BATTERY_OKAY)
    addAction(Intent.ACTION_BATTERY_CHANGED)
    addAction(Intent.ACTION_POWER_CONNECTED)
    addAction(Intent.ACTION_POWER_DISCONNECTED)
}
registerReceiver(receiver, filter)

🍷 3. 시스템 인텐트 없이 배터리 상태 파악하기

val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
val batteryStatus = registerReceiver(null, intentFilter)
  • 필터만 만들고 registerReceiver()receiver에 null값 전달.
  • 아래의 두 조건을 만족하는 경우에 인텐트가 없는 registerReceiver()를 사용한다.
  1. 특정한 작업을 수행하고 싶은 것이 아님
  2. 배터리와 관련된 정보를 얻고 싶음
  • 배터리와 관련된 정보를 registerReceiver()의 반환값인 인텐트 객체에 엑스트라 정보로 등록

☕ 4. 인텐트의 엑스트라를 이용해 배터리 상태 파악하기

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("kkang", "usb charge")
        BatteryManager.BATTERY_PLUGGED_AC -> Log.d("kkang", "ac charge")
    } else {
    	Log.d("kkang", "not charging")
    }
}
  • !!는 객체가 널일 때 예외를 일으키는 연산자이다.
  • BatteryManager.EXTRA_STATUSIntent.ACTION_BATTERY_CHANGED의 추가 정보로 현재 배터리 상태 정보를 담고있다.

🍵 5. 배터리 충전량을 퍼센트로 출력

val level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
val batteryPct = level / scale.toFloat() * 100
Log.d("kkang", "batteryPct : $batteryPct")
  • EXTRA_LEVEL : Intent.ACTION_BATTERY_CHANGED의 추가 정보로 현재의 배터리 레벨 정보가 담겨있다.
  • EXTRA_SCALE : Intent.ACTION_BATTERY_CHANGED의 추가 정보로 최대 배터리 레벨 정보가 담겨있다.
profile
https://morethan-hyeonz1.vercel.app/

0개의 댓글