Build.VERSION.SDK_INT : 앱이 실행되는 기기의 API 레벨
getSystemService() 함수의 반환형이 Any?이므로, 이를 적절한 _Manager 타입으로 캐스팅해서 변수에 할당해야 한다.NOTIFICATION_SERVICE 매개변수를 사용하여 NotificationManger 객체를 얻을 수 있다. 이를 통해 푸시 알림을 생성, 관리 및 제어할 수 있다.
NotificationManager 클래스의 실제 내부 구현은 안드로이드 프레임워크의 일부로, 공개적으로 확인할 수 없으며 어차피 개발자는 notify() 처럼 외부로 공개된 함수 시그니처만 알면 알림을 발행할 수 있기 때문에 내부 코드는 알 필요가 없다.
class NotificationManager {
// 특정 알림을 생성하거나 업데이트하는 함수
// id: 알림 식별자, notification: 표시할 알림 객체
fun notify(id: Int, notification: Notification)
}

⭐ 이렇게 번거롭게 시스템 서비스를 얻어야 하는 이유는 원래 상태 바는 시스템에서 관리하는 곳이며 앱이 직접 제어할 수 없기 때문이다. 대신 시스템 측에서 알림을 위해 제공하는 API를 앱에서 이용해 시스템에 알림 기능을 실행하도록 의뢰할 수 있다. 이렇듯 getSystemService()와 관련된 기능들은 모두 알림, 키보드와 같이 내가 개발하는 앱의 단독 기능이 아니라, 안드로이드 OS에 이미 구현되어 있는 기능들이다. Manager 라는 이름에서 알 수 있듯이 NotificationManager, InputMethodManager 등은 전부 기능을 관리하기 위한 매니저 클래스다.
RecyclerView의 Adapter를 갱신할 때,
val adapter = activityMainBinding.recyclerView.adapter as RecyclerViewAdapter
adapter.notifyDatasetChanged()
와 같이 내 화면에 이미 존재하는 RecyclerView의 Adapter를 가져와 형변환 후 함수를 호출하듯이 => 이미 시스템에 존재하는 서비스를 가져와 프로그래밍에 쓸 수 있는 타입으로 형변환한 후 함수를 호출한다.
INPUT_METHOD_SERVICE 매개변수를 사용하여 InputMethodManager객체를 얻을 수 있다. 이를 통해 키보드 및 입력 방법 관련 작업을 처리할 수 있다.
class InputMethodManager {
// 키보드 표시
fun showSoftInput(view: View, flags: Int): Boolean {}
// 키보드 숨김
fun hideInputFromWindow(windowToken, IBinder, flags: Int): Boolean {}
}
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(currentFocus, 0)
EditText, TextView와 같은 입력 필드가 해당된다.thread를 만들어서 레이아웃이 다 그려지기를 기다렸다가 키보드를 올려야 한다. (보통 500ms)val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
!!는 현재 포커스가 null이 아님을 단언하는 Not-null 연산자. 포커스가 null일 경우 예외 발생.hideSoftInputFormWindow()함수는 포커스를 가진 뷰에서만 소프트 키보드를 숨길 수 있기 때문에, 키보드를 숨기려는 뷰는 포커스를 가지고 있어야 한다.안드로이드에서는 다양한 시스템 서비스(앱이 아니라 시스템 OS 단계에서 제공되는 기능)가 제공되며, getSystemService() 함수를 사용하여 해당 서비스의 인스턴스를 얻을 수 있다. 이렇게 얻은 서비스 인스턴스를 사용하여 해당 서비스와 관련된 작업을 수행할 수 있다.