개발자 끄적끄적
Coroutin, Service 본문
<코루틴(Corutine)>
- 코틀린에서 병행(비동기) 수행을 프로그래밍하는 방법
- 병행 수행은 언제 ?
- 네트워크나 I/O 등 비동기 처리가 필요한 경우
- 스레드를 직접 다루기보다는 코루틴을 사용하는 것이 편리하고 효율적
- 특징
- 가볍다
- 취소 가능
- 다양한 Jetpack에서 코루틴을 이용한 API 제공
- build.gradle
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
<비동기(Asynchronous), Non-Blocking>
- Coroutine 1은 Coroutine2의 작업을 시작하고 Non-Blocking 상태로 계속 실행
- Coroutine 2는 Coroutine 1에 대해 비동기(Asynchronous)로 수행
- Coroutine 1과 Coroutine 2는 병행(concurrency) 수행
- Coroutine 3은 Coroutine 4가 끝날 때까지 Blocking
<코루틴을 사용하려면>
- 코루틴 범위(CoroutineScope)를 생성, 지정
- runBlocking, CoroutineScope()
- runBlocking은 범위 내의 코루틴이 모두 종료될 때까지 블록된다
- 범위 내에서만 코루틴을 생성, 사용할 수 있다
- View model에서 제공하는 viewModelScope도 있다
- View model이 clear 될 때 자동으로 범위에 포홤된 코루틴이 취소된다
- 코루틴 생성
- launch, async
- 코루틴을 생성하고 시작한다
- 코루틴 컨텍스트
- 코루틴 수행에 필요한 디스패처, Job, 이름 등을 가질 수 있다
- 디스패처(Dispatcher) 지정
- 메인 쓰레드에서 수행할 지, 다른 쓰레드에서 수행할 지 결정한다
- Dispatcher.Main, Dispatcher.Default, Dispatcher.IO
*같은 쓰레드 : Dispatcher.Default = Dispatcher.IO
<코루틴 함수>
- fun CoroutineScope( //코루틴 범위 내에서만 사용 가능
context: CoroutineContext
): CoroutineScope
- CoroutineContext를 인자로 주고 코루틴 범위 객체 생성
- fun CoroutineScope.launch(
context: CoroutineContext,
start: CoroutineStart,
block: suspend CoroutineScope.() → Unit
): Job
- 코루틴 생성
- CoroutineStart – 시작 옵션, DEFAULT, LAZY, ATOMIC(중단안됨)
- suspend fun <T> withContext( //코루틴 범위 내에서만 사용 가능
context: CoroutineContext,
block: suspend CoroutineScope.() → T
): T
- 현재 코루틴 수행중인 것은 멈추고 withContext로 주어진 코루틴 컨텍스트로 코루틴 수행
<안드로이드 앱 컴포넌트(Component)>
- 액티비티(Activity)
- 사용자 UI를 제공하는 컴포넌트
- 전면(foreground)에서만 동작, 화면에서 사라지면 onStop
- 라이프싸이클 이벤트나 사용자 입력을 처리하는 방식으로 프로그래밍
- 서비스(Service)
- 백그라운드에서 수행할 작업을 위한 컴포넌트
- 서비스 라이프싸이클 이벤트를 처리하는 방식으로 프로그래밍
- 브로드캐스트 수신자(Broadcast Receiver)
- 시스템에 방송하는 다양한 이벤트(인텐트)를 수신하기 위한 컴포넌트
- 이벤트를 처리하는 방식으로 프로그래밍
- 컨텐트 제공자(Content Provider)
- 다른 앱과 공유할 데이터를 관리하고 제공하는 컴포넌트
- 데이터 요청에 응답하는 방식으로 프로그래밍
<서비스>
- 백그라운드로 처리할 작업을 위한 앱 컴포넌트
- 실제 백그라운드 작업은 코루틴이나 WorkManager를 사용
- 원칙적으로 사용자 인터페이스는 제공하지 않다
- 3가지 서비스
- Started 서비스 : 시작 명령에 의해 시작되는 서비스
- Foreground 서비스 : 알림을 띄우고 사용자에게 상태를 보여주면서 동작하는 서비스
- Background 서비스 : UI를 전혀 제공하지 않는 서비스
- Bound 서비스
- 서비스와 바인딩한 후, 서비스가 제공하는 함수들을 호출
- 클라이언트 : 서버 형태로 제공하는 서비스
*WorkManager : http://developer.android.com/topic/libraries/architecture/workmanager
<서비스 만들기>
- 클래스 정의와 Manifests에 서비스 등록
- Servie를 상속한 서비스 정의 클래스
- AndroidManifest 파일에 service 등록
<Started 서비스 구현>
- Foreground나 Background 서비스 제공
- Service 클래스의 onStartommand() 재정의
- Foreground 서비스의 경우 startForeground() 호출
- 클라이언트에서
- startService(intent) 호출
- 안드로이드 8.0부터 startForegroundService(intent) 호출 제공
- Foreground 서비스를 위해 사용, 반드시 서비스에서 startForeground 호출 필요
- 안드로이드 9.0부터 Foreground 서비스를 사용하려면 권한 필요
- AndroidManifest.xml에 권한 추가
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
- 안드로이드 13(API=33)부터 알림(동적)권한도 필요
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<알림(Notification)코드>
- 알림은 화면의 상단에 앱과 관련된 정보를 표시
- 알림을 만들기 위해서
- NotificationChannel 생성
- 알림 채널, 안드로이드 8.0 부터 등장
- Notifiaction 생성
- Notificationompat.Builder를 이용
- NotificationManagerCompat의 notify로 알림 표시
- NotificationManagerCompat.from(context)으로 NotificationManager 객체 얻는다
- Foreground 서비스에서는 알림 표시를 위해 startForeground를 처음 한 번은 반드시 아용해야 한다
<Bound 서비스>
- 클라이언트-서버 방식에서 서버에 해당
- 클라이언트는 액티비티 등이 되고, 다른 앱의 컴포넌트도 될 수 있다
- 다른 앱의 컴포넌트가 클라이언트가 된다면, IPC가 된다
- Bound 서비스 종류
- Binder를 상속하여 만들기
- 한 프로세스에서만 사용할 경우
- Messenger나 AIDL 사용
- 여러 프로세스가 사용할 경우
- IPC가 가능한 방법
- AIDL보다 Messenger 사용하기 쉽고, 권장
<권한>
- 제한된 정보나 행위를 접근/수행하기 위해 권한 필요
- 권한이 없는 앱의 특정 정보에 접근하려고 하면 예외 발생
- 해당 정보 접근에 필요한 권한을 앱에 부여해야한다
- 권한
- 설치시 권한 부어 : Manifest 파일에 권한을 표시만 하면 설치할 때 부여된다
- 동적 권한 부여 : 보통 민감한 정보와 관련된 권한, 실행 시 사용자에게 요청
- 권한 예시
- Manifest.permission.FOREGROUND_SERVICE : 포그라운드 서비스 사용
- Manifest.permission.POST_NOTIFICATIONS : 알림 표시 권한
<동적 권한 부여 방법>
- AndroidManifest.xml에 권한을 표시하고 설치시에 사용자에게 확인
- 앱이 실행 중에 권한이 필요할 때 사용자에게 권한 부여 요청
- 설치할 때가 아니고 사용할 때 권한을 부여
- 최근에는 일시적으로 권한을 부여하고나, 앱이 사용 중일 때만 권한을 부여하는 경우도 있다. 보통 위치 접근과 같이 민감한 정보에 대한 권한일 경우
- 동적 권한 요청하기 전에 사용자게에 권한의 필요성을 설명하도록 권장
- 최근에 앱 설치 후 실행하면 필요한 권한에 대한 설명을 보여주는 화면 보여준다
'안드로이드 프로그래밍' 카테고리의 다른 글
방송과 컨텐트 리졸버(Content Resolver) (0) | 2023.06.05 |
---|---|
데이터 저장(File, Preference) (0) | 2023.05.18 |
목록표시 UI (0) | 2023.05.14 |