티스토리 뷰

Android

Activity Result API

parkho79 2021. 6. 4. 14:39
300x250
300x250



Activity 간 데이터를 주고받을 때 사용했던 startActivityForResult(), onActivityResult() 가 deprecated 되었다.

이번 포스팅에서는 deprecated 된 API 를 대신하여 도입된 registerForActivityResult() 에 대해 알아보자.



startActivityForResult - onActivityResult

하단은 전통적인 startActivityForResult(), onActivityResult() 방식이다.

 

 

코드만 봐도 알겠지만, 이 방식은 여러 문제점들이 있다.

 

◼ Tight Coupling (강한 결합)

해당 code 와 logic 을 추상화 시키거나 다른 곳으로 분리 시킬 수 없는 구조이다. (delegate 정도는 가능하겠지만..)

이런 상황은 중첩된 if - else 구조를 생상해 낸다.

 

◼ Casting error 유발

개발자의 부주의 일수도 있지만 casting error 가 쉽게 발생할 수 있는 구조다.

 

◼ NullPointerException

NullPointerException 또한 발생하기 쉬운 구조다.

Debug 시간을 충분히 늘려주는 부수 효과도 있다.



Activity Result API

Activity Result API 를 적용하면 하단과 같은 이점이 있다.

 

◼ Fragment/Activity 의 boilerplate code 가 줄어듦

OnActivityResult 를 override 할 필요가 없고, requestCode 를 확인하는 일도 없다.

등록한 콜백에서 결과를 처리하기만 하면 된다.

 

◼ Activity 와의 분리

API 는 launcher 에 등록할 때 ActivityResultRegistry 를 사용하지만, 이 외에는 참조 없이 작동이 가능하다.

이로 인하여 깔끔하고 재사용 가능한 구조가 가능하다.

 

◼ 가독성 증가

하나의 launcer 는 하나의 contract 를 실행하고 그 결과를 하나의 callback 으로 반환한다.



Dependency 추가

하단과 같이 app gradle file 에 추가한다.

최신버전의 appcompat 만으로도 사용할 수 있다.

 



Pre-Built Contracts

ActivityResultContracts 를 사용하면 이미 정의된 Contract 를 이용해 쉽게 Activity Result API 사용할 수 있다.

 

◼ java

 

◼ kotlin

 

기 정의된 Contract 는 하단과 같다.

- StartActivityForResult : 요청한 인텐트로 액티비티를 실행하고, 액티비티 결과를 ActivityResult 로 반환한다.

- GetContent : 사용자가 선택한 콘텐트의 uri 를 반환한다.

- GetMultipleContent : 사용자가 선택한 1개 이상의 콘텐츠들이 List 로 반환된다.

- TakePicturePreview : 사진을 찍고 bitmap 을 반환한다.

- TakePicture : 촬영한 사진을 지정한 경로에 저장하고 bitmap 을 반환한다.

- TakeVideo : 촬영한 비디오를 지정한 경로에 저장하고 썸네일을 bitmap 으로 반환한다.

- CreateDocument : 새로운 문서를 작성하고 해당 경로를 uri 로 반환한다.

- OpenDocument : 사용자가 선택한 문서의 uri 를 반환한다.

- OpenMultipleDocuments : 사용자가 선택한 1개 이상의 문서들이 List 로 반환된다.

- OpenDocumentTree : 사용자가 선택한 디렉토리의 uri 를 반환한다.

- PickContact : 사용자가 선택한 연락처의 uri 를 반환한다.

- RequestPermission : 단일 권한을 요청하고, 승인 여부를 반환한다.

- RequestMultiplePermissions : 다중 권한을 요청하고, 승인 여부를 Map 로 반환한다.



Custom Contracts

ActivityResultContracts 에는 미리 빌드된 ActivityResultContract 클래스가 여러 개 포함되어 사용할 수 있지만, 개발자가 정확히 필요한 유형의 안전한 API 를 제공하는 custom contracts 를 직접 만들 수도 있다.

 

◼ java

 



◼ kotlin

 



Source code

https://github.com/parkho79/ActivityResultAPI



728x90
댓글