개발자 끄적끄적

Coroutin, Service 본문

안드로이드 프로그래밍

Coroutin, Service

햏치 2023. 5. 30. 02:13

<코루틴(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