-
[Android/Java] startActivityForResult() 대체Android 2022. 5. 24. 21:21반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
*androidx.activity:activity:1.2.0-alpha02 부터는 startActivityForResult() 대신 registerForActivityResult() 사용 권장*
<갤러리 이미지 불러와서 ImageView에 띄우기 예시>
1. Intent 생성
Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); launcher.launch(intent);
2. registerForActivityResult() 작성
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if(result.getResultCode()==RESULT_OK){ Uri uri = result.getData().getData(); performance_imageView.setImageURI(uri); iamge_textView.setText(""); }//RESULT_OK else if(result.getResultCode()==RESULT_CANCELED){ }//RESULT_CANCELED } });//launcher
- registerForActivityResult()란?
- 결과 콜백 등록할 수 있는 메서드
https://developer.android.com/training/basics/intents/result?hl=ko
활동에서 결과 가져오기 | Android 개발자 | Android Developers
활동에서 결과 가져오기 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를
developer.android.com
- launcher는 반드시 전역변수로 선언하고 onCreate()나 onStart()에서 초기화해야 함(그렇지 않으면 오류 발생)
<startActivityForResult()와의 차이>
1. REQUEST_CODE 사라짐
2. startActivityForResult()는 onActivityResult()에서 콜백 받아서 처리
- 이 경우 메모리 부족으로 인해 Activity가 사라질 수도 있는 위험이 있음
- 위를 방지하기 위해 Activity 실행 부분과 Result Callback 부분 분리해서 만듦
- registerForActivityResult()가 콜백 등록하는 역할 함
3. Acitivty가 종료되었다가 다시 만들어진 경우에도 Result값 기다릴 수 있음
- startActivitiyForResult()를 사용했을 때 액티비티 A가 액티비티 B를 호출한 후 메모리 부족으로 인해 A가 소멸되면 B 액티비티 종료 후 A에게 결과 넘기면 A는 소멸된 후 다시 생성되었으므로 B에게 결과값 요청한 것을 모름
- registerForActivityResult()를 사용했을 때 똑같이 A가 소멸되어도 A가 다시 생성되면 registerForActivityResult()가 다시 콜백 등록해 줘서 결과값 받아 옴
(차이점은 아래의 블로그를 참고했습니다)
반응형'Android' 카테고리의 다른 글
[Android] Manifest android:exported (0) 2022.08.28