티스토리 뷰
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
'Android' 카테고리의 다른 글
requireContext, requireActivity (0) | 2021.08.26 |
---|---|
Glide 로 background image 설정하기 (0) | 2021.08.06 |
유용한 이미지 라이브러리 - Glide (2) (0) | 2021.05.13 |
유용한 이미지 라이브러리 - Glide (1) (0) | 2021.05.13 |
Android 진동 울리기 (1) | 2020.06.18 |
- Total
- Today
- Yesterday
- 리워드 어플
- Android Service
- bindservice
- 무료 채굴
- android activity flag
- StringUtils
- task
- mPANDO
- M2E
- 채굴앱
- p2e
- notifyDataSetChanged
- 안드로이드 인텐트
- RoomDatabase
- WEMIX
- android task
- 앱테크 추천
- task 생성
- android intent
- registerForContextMenu
- 안드로이드 서비스
- android flag activity
- BroadcastReceiver
- StartService
- onContextItemSelected
- 무료채굴
- Intent
- 앱테크
- 리워드앱
- onCreateContextMenu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |