본문 바로가기
Android

[Android/Java] ActivityResultLauncher 및 ActivityResultContracts 활용 방법

by quessr 2024. 5. 2.

 

ActivityResultLauncher는 안드로이드 앱 개발에서 다른 액티비티로부터 결과를 받아오기 위해 사용되는 클래스입니다. AndroidX 라이브러리의 일부로, Android 11(R API 레벨 30)이 출시됨과 동시에 소개되었습니다. 기존의 startActivityForResult() 메서드와 onActivityResult() 콜백 방식을 대체하기 위해 도입되었으며, 사용하기 쉽고, 코드가 더 읽기 쉬워지고, 타입 안전성을 높여줍니다.

 

기본 사용 방법

  1. ActivityResultContracts 정의: ActivityResultLauncher를 사용할 때는, 어떤 타입의 액티비티 결과를 기대하는지 정의해야 합니다. 이는 ActivityResultContracts에 있는 다양한 계약 중 하나를 사용하여 수행됩니다. 예를 들어, 사용자에게 이미지를 선택하도록 요청하고 싶다면 ActivityResultContracts.GetContent 계약을 사용할 수 있습니다.
  2. ActivityResultLauncher 인스턴스 생성: 액티비티 또는 프래그먼트에서 registerForActivityResult() 메서드를 호출하여 ActivityResultLauncher 인스턴스를 생성합니다. 이때, 위에서 선택한 계약과 결과를 처리할 콜백을 함께 제공합니다.
  3. 액티비티 시작: 생성한 ActivityResultLauncher를 사용해서 액티비티를 시작합니다. 액티비티의 결과는 설정한 콜백을 통해 반환됩니다.

예제 코드

public class MyActivity extends AppCompatActivity {
    // ActivityResultLauncher 정의
    private ActivityResultLauncher<String> mGetContent = registerForActivityResult(
            new ActivityResultContracts.GetContent(),
            uri -> {
                // 사용자가 선택한 컨텐츠에 대한 URI를 처리
            }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> {
            // 이미지 선택기를 열기 위해 ActivityResultLauncher 실행
            mGetContent.launch("image/*");
        });
    }
}

 

장점

  • 타입 안전성: 각 ActivityResultContract는 요청을 시작할 때 필요한 입력 타입과 결과로 반환되어야 할 타입을 명시합니다. 이는 런타임 오류의 위험을 줄여줍니다.
  • 코드의 명확성: 결과를 처리하는 로직이 등록 시점에 명확하게 정의되기 때문에, onActivityResult에 여러 조건 분기를 작성할 필요가 없어집니다.
  • 생명주기 인식: ActivityResultLauncher가 생명주기를 인식하기 때문에, 액티비티나 프래그먼트의 상태에 따라 적절히 관리됩니다.

ActivityResultLauncher 현대적인 방식으로 액티비티 간의 데이터 교환을 간소화하여, 안드로이드 개발을 더욱 효율적으로 만들어 줍니다.

 

가지 주요 ActivityResultContract 구현체들

  • ActivityResultContracts.StartActivityForResult
    • 설명: 사용자 정의 Intent를 통해 다른 액티비티를 시작하고, 그 결과를 받기 위해 사용됩니다. 이 구현체는 새 액티비티에서 설정한 결과와 함께 돌아온 Intent를 반환합니다.
    ActivityResultContracts.GetContent
    • 설명: 사용자에게 문서나 이미지와 같은 특정 타입의 데이터를 선택하도록 요청합니다. 파일 선택기를 통해 사용자가 선택한 컨텐트의 Uri를 반환합니다.
    ActivityResultContracts.RequestPermission
    • 설명: 단일 권한 요청에 사용됩니다. 사용자가 권한을 부여했는지 거부했는지에 대한 boolean 결과를 반환합니다.
    ActivityResultContracts.RequestMultiplePermissions
    • 설명: 복수의 권한을 요청할 때 사용됩니다. 각 권한에 대한 부여/거부 결과가 Map<String, Boolean> 형태로 반환됩니다. 여기서 key는 권한의 이름, value는 사용자의 결정입니다.
    ActivityResultContracts.TakePicturePreview
    • 설명: 카메라 앱을 통해 사진을 촬영하고 촬영한 사진의 미리보기 Bitmap을 반환합니다. 이는 사진을 저장하지 않고 즉시 사용할 때 유용합니다.
    ActivityResultContracts.TakePicture
    • 설명: 카메라를 사용하여 사진을 촬영하고, 사진을 파일로 저장합니다. 성공적으로 사진을 저장했는지 여부를 Boolean으로 반환합니다. 이 작업을 위해 파일의 Uri를 인자로 제공해야 합니다.
    ActivityResultContracts.CreateDocument
    • 설명: 사용자에게 문서를 만들라는 요청을 하고, 선택한 위치에 문서를 저장할 있는 Uri 반환합니다. 이는 파일 생성 작업에 사용됩니다.

참고: https://developer.android.com/training/basics/intents/result#java 

 

활동에서 결과 가져오기  |  Android 개발자  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 활동에서 결과 가져오기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱 내에서든 다른 앱에서든

developer.android.com