본문 바로가기
Android

Android 12 변경사항 - API 관점

by 들풀민들레 2021. 12. 1.

 

 

강의에서 사용하기 위해서 정리한 글입니다. 내용에 오류가 있을수 있습니다.

 

 

 

Toast Icon

 

Toast API 에는 변경사항이 없는데 출력되는 모습에 변화

Toast 문자열에 기본 App Icon 이미지 출력

 

 

 

WindowMetrics

 

디바이스 사이즈 정보 획득에 사용되었던 DisplayMetrics 는 deprecation

WindowMetrics 를 사용할 것을 권장

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics
    val insets: Insets = windowMetrics.windowInsets
        .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
    windowMetrics.bounds.width() - insets.left - insets.right


    binding.textView2.text = """
       
        insets.left : ${insets.left}
        insets.right : ${insets.right}
        insets.top : ${insets.top}
        insets.bottom : ${insets.bottom}
       
        windowMetrics.bounds.width() : ${windowMetrics.bounds.width()}
        windowMetrics.bounds.height() : ${windowMetrics.bounds.height()}
       
        windowMetrics.bounds.left : ${windowMetrics.bounds.left}
        windowMetrics.bounds.right : ${windowMetrics.bounds.right}
        windowMetrics.bounds.top : ${windowMetrics.bounds.top}
        windowMetrics.bounds.bottom : ${windowMetrics.bounds.bottom}
       
        window width : ${windowMetrics.bounds.width() - insets.left - insets.right}
       
        """
} else {
    val display = windowManager.defaultDisplay
    val displayMetrics = DisplayMetrics()
    display?.getRealMetrics(displayMetrics)

    binding.textView2.text = """
        widthPixels : ${displayMetrics.widthPixels}
        heightPixels : ${displayMetrics.heightPixels}
        densityDpi : ${displayMetrics.densityDpi}
        density : ${displayMetrics.density}
        scaledDensity : ${displayMetrics.scaledDensity}
        xdpi : ${displayMetrics.xdpi}
        ydpi : ${displayMetrics.ydpi}
       """
}

 

VibratorManager

 

Vibrator deprecation

VibratorManager 사용 권장

 

val vibrator  = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager =  this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
    vibratorManager.defaultVibrator;
} else {
    getSystemService(VIBRATOR_SERVICE) as Vibrator
}

 

PendingIntent flag 값 지정

 

PendingIntent flag 값을 immutable 혹은 mutable 둘중 하나를 주어야 함.

안그러면 런타임 에러발생

 

val intent = Intent(this, DetailActivity::class.java)
val pendingIntent =
    PendingIntent.getActivity(this, 10, intent,
        PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent)

 

Activity Lifecycle 변경

 

12 버전부터 root activity 의 경우 back button 에 의해 종료되지 않는다.

onStop() 까지 호출되고  onDestory() 가 호출되지 않는다.

물론 root activity 가 아니면 back button 에 의해 종료된다.

 

finish() 에 의한 종료는 root activity onDestory 호출된다.

 

 

 

TelephonyCallback 

 

PhoneStateListener deprecated

TelephonyCallback 으로 대체

 

TelephonyManager 에게 TelephonyCallback 을 구현한 객체를 등록하면 상태 변화가 발생했을 때 TelephonyCallback 의 함수가 자동 호출

 

telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    telephonyManager.registerTelephonyCallback(
        mainExecutor,
        object : TelephonyCallback(), TelephonyCallback.CallStateListener {
            override fun onCallStateChanged(state: Int) {
                when (state) {
                    TelephonyManager.CALL_STATE_IDLE -> {
                        Log.d("kkang", "IDLE....")
                    }
                    TelephonyManager.CALL_STATE_OFFHOOK -> {
                        Log.d("kkang", "OFFHOOK....")
                    }
                    TelephonyManager.CALL_STATE_RINGING -> {
                        Log.d("kkang", "RINGING....")
                    }
                }
            }
        })


}

 

TelephonyManager TelephonyCallback 등록은 registerTelephonyCallback() 함수를 이용해 등록하며 등록되는 객체는 TelephonyCallback 을 상속받은 객체이어야 한다.

그리고 위의 코드처럼 TelephonyCallback.CallStateListener 라는 인터페이스를 구현한 객체이어야 하는데 인터페이스는 감지하고자 하는 상태에 따라 여러가지가 준비되어 있어야 한다.

위의 코드에서 이용한 TelephonyCallback.CallStateListener 는 전화가 걸려오는 상황을 감지할 때 사용되는 인터페이스이다.

TelephonyCallback.CallStateListener 이외에 다양한 상황 감지를 위해 여러  인터페이스들이 준비되어 있으며 대표적인 것들을 소개하면 아래와 같다.

 

TelephonyCallback.CellLocationListener cell 위치 변경 감지

TelephonyCallback.ServiceStateListener – 서비스 상태 변경 감지

TelephonyCallback.SignalStrengthsListener – 신호세기 변경 감지

TelephonyCallback.DataActivityListener – 데이터 송수신 상태 변경 감지

TelephonyCallback.DataConnectionStateListener – 데이터 커넥션 상태 변경 감지

TelephonyCallback.CallStateListener – 전화 상태 변경 감지

 

 

Location 퍼미션

 

 

12 버전부터 ACCESS_FINE_LOCATION 을 걸려면 ACCESS_COARSE_LOCATION 을 같이 걸어줘야 한다.

 

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