시스템 서비스(네트워킹, 위치정보, 알림 등과 같은 시스템 수준의 기능)에 안드로이드 앱에서 접근할 수 있게 해주는 역할을 하는 메서드이다.
'getSystemService'는 안드로이드 앱이 시스템 서비스와의 상호작용을 통해 기기의 핵심 기능들에 접근할 수 있게 해주는 핵심 메서드이자 운영체제의 핵심 부분이며, 이를 통해 앱의 기능을 확장시키는데 필요한 시스템 서비스들을 사용할 수 있다.
'Context' 클래스의 일부분으로 제공되고 시스템 서비스에 대한 핸들러를 반환한다.
이 핸들러를 통해서 시스템 서비스의 기능을 사용할 수 있다.
https://developer.android.com/reference/android/content/Context
val layoutInflater = applicationContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
layoutInflater.inflate(R.layout."test.xml파일",null)
val activityManager = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningAppProcesses = activityManager.runningAppProcesses
//현재 실행중인 어플리케이션들의 정보를 가지고 있다(pid,uid,processName,pkgList등)
//안드로이드 5.1 이후로는 사용이 거의 무의미하다.
//UsageStatusManager를 사용하여 앱의 사용시간을 추적하거나
//RunningTaskInfo를 사용하여 정보를 얻는 방법이 있다.
val connectivityManager = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//현재 인터넷에 연결되어 있는지의 상태 Boolean으로 확인 deprecated되었음.
val isConnected = connectivityManager.activeNetworkInfo?.isConnected
//ConnectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) 등의 메서드로 대체
val inputMethodManager = applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
//포커스를 받으면 소프트 키보드를 보여줌
inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
//포커스를 잃으면 키보드를 숨김
inputMethodManager.hideSoftInputFromWindow(editText.windowToken, 0)
//현재 소프트 키보드의 상태를 토글함(숨겨져 있다면 보여주고, 보여져 있다면 숨김)
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
val uiModeManager = applicationContext.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
//Boolean으로 어떤 UI모드에 있는지 확인
val isInAnyMode = uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_ANY
UI_MODE_TYPE_NORMAL: 일반 모드
UI_MODE_TYPE_DESK: 데스크 모드
UI_MODE_TYPE_CAR: 자동차 모드
UI_MODE_TYPE_TELEVISION: 텔레비전 모드
UI_MODE_TYPE_APPLIANCE: 가전제품 모드
UI_MODE_TYPE_WATCH: 시계 모드
UI_MODE_TYPE_VR_HEADSET: VR헤드셋 모드
val downloadManager = applicationContext.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
//URL에서 파일을 다운로드 할 수 있음
val request = DownloadManager.Request(Uri.parse("http://example.com/myfile"))
val downloadId = downloadManager.enqueue(request)
val powerManager = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
//절전모드인지 확인 Boolean
val isPowerSaveMode = powerManager.isPowerSaveMode
isInteractive //활성 상태
isDeviceIdleMode//유휴 모드
val keyguardManager = applicationContext.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
//잠금화면이 활성화되어 있는지 확인
val isInKeyguardRestrictedInputMode = keyguardManager.inKeyguardRestrictedInputMode()
//잠금화면이 보안 화면인지 확인
val isKeyguardSecure = keyguardManager.isKeyguardSecure()
//잠금화면이 보여지고 있는지를 확인
val isKeyguardLocked = keyguardManager.isKeyguardLocked()
'LocationManager'나 'ActivityManager'와 같은 서비스들은 사용자의 개인정보를 침해할 수 있음으로 항상 명시적인 동의를 얻어야 한다.
몇몇 시스템 서비스를 사용하기 위해서는 특정한 권한이 필요하기 때문에 이 권한을 'AndroidManifest.xml'에 선언하고 사용자에게 권한 수락을 요청해야 한다.
시스템 서비스는 기기의 리소스를 사용하기 때문에 불필요한 리소스 사용을 줄이도록 최적화해야 한다. 예를 들면 네트워크 연결이라던지 위치를 받아오는 서비스들은 너무 자주 호출하지 않도록 하는것이 좋다.
몇몇 시스템 서비스들은 특정 API레벨 이상에서만 사용할 수 있기 때문에 여러 안드로이드 버전에서 작동하도록 만든 경우,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
와 같은 코드들로 확인해야 합니다.
사용자의 데이터를 수집하고 저장하는 방식은 사용자에게 명확하게 알려져야 하며 앱의 정책에 명시되어 있어야 합니다.
'getSystemService'는 종종 앱의 생명주기와 긴밀하게 연결되어 있기 때문에 앱의 생명주기를 관리하며 필요한 서비스를 적절한 타이밍에 초기화하고 해제하는 것이 중요하다. 서비스가 필요하지 않은 시점에도 계속 활성화되어 있으면 리소스 낭비가 발생할 수 있으므로, 앱의 생명주기에 맞추어 서비스를 관리하는 것이 필요하다.
val userJson = """{"name":"Jinho", "age":28}"""
val jsonObject = JSONObject(userJson)
val name = jsonObject.getString("name")
val age = jsonObject.getInt("age")
val user = User(name, age)
라는 json 코드를
//Gson을 통해 JSON을 파싱
val gson = Gson()
val userJson = """{"name":"Jinho", "age":28}"""
//Gson 라이브러리를 통해 JSON데이터를 Kotlin객체로 한줄로 변환할 수 있다.
val user = gson.fromJson(userJson, User::class.java)
로 간편하게 json 문자열을 파싱해준다.
class UserDbHelper(context: Context) : SQLiteOpenHelper(context, "database-name", null, 1) {
companion object {
private const val TABLE_NAME = "User"
private const val COLUMN_ID = "id"
private const val COLUMN_NAME = "name"
private const val COLUMN_AGE = "age"
}
override fun onCreate(db: SQLiteDatabase) {
val createTableQuery = "CREATE TABLE $TABLE_NAME " +
"($COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"$COLUMN_NAME TEXT, " +
"$COLUMN_AGE INTEGER)"
db.execSQL(createTableQuery)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
onCreate(db)
}
이런식의 SQLiteOpenHelper를 상속받은 UserDbHelper 클래스를 만들어서 직접 데이터베이스를
생성하는 코드를
db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
userDao = db.userDao()
'Room'은 어노테이션을 활용해서 테이블이나 쿼리문을 정의해서 사용할 수 있고
라이브러리가 알아서 데이터베이스를 생성하고 테이블을 만들고 쿼리를 실행한다.
val url = URL("testurl")
val conn = url.openConnection() as HttpURLConnection
conn.requestMethod = "GET"
conn.connect()
val responseCode = conn.responseCode
val inputStream: InputStream? = if (responseCode == 200) { // Success
conn.inputStream
} else {
conn.errorStream
}
val reader = BufferedReader(InputStreamReader(inputStream))
val builder = StringBuilder()
var line: String? = null
while (reader.readLine().also { line = it } != null) {
builder.append(line)
}
val result = builder.toString()
reader.close()
conn.disconnect()
와 같은 방식으로 작성되는 네트워크에 요청을 보내고 데이터를 받아오는 코드를
val retrofit = Retrofit.Builder()
.baseUrl("testurl")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(ApiService::class.java)
val users = api.getUsers()
이렇게 간편화시켜준다. 위에서 소개한 'Gson' 라이브러리는 직접적으로 서비스 시스템을 도와주는
라이브러리는 아니지만 받아온 'JSON'데이터를 쉽고 에러를 줄이면서 처리할 수 있다.