작업을 하며 액티비티 간 전환과 데이터 통신은 꼭 필요하다.
예전에는 이와 같은 상황에 startActivityForResult()나 onActivityResult()를 사용했던 것 같은데
현재는 Deprecated되었고 ActivityResultLauncher 콜백을 이용하여 구현하는 경우가 대부분인 듯 하다.
그럼 ActivityResultLauncher 사용 예시를 소스와 함께 살펴보겠다.
우선 MainActivity에 callback을 등록하고 타 액티비티로 전환한다. (주석 참고)
SubActivity에서 setResult를 통해 int 타입의 code를 전달할 것이므로, 미리 정의하여 callback에서 받을 준비를 한다.
나는 code를 임의로 96201로 정의한 뒤, callback 메소드에 해당 코드일 경우에만 intent를 받아 저장하는 로직을 작성했다.
public class MainActivity extends AppCompatActivity {
public ActivityResultLauncher<Intent> activityResultLauncher;
private final int RESULT_CODE_FROM_SUBACTIVITY = 96201;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**call back 등록*/
activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode == RESULT_CODE_FROM_SUBACTIVITY){
/**최종적으로 받아서 사용할 데이터*/
Intent intent = result.getData();
}
}
});
/**result launcher를 이용하여 타 액티비티 launch함*/
Intent subActivityIntent = new Intent();
subActivityIntent.setClassName("Package Name","Class Name");
activityResultLauncher.launch(subActivityIntent);
}
}
SubActivity에서 작성하는 소스는 다음과 같다.
intent와 code를 함께 setResult에 넣어주면 된다.
해당 로직은 기존 사용하던 방법과 같다.
public class SubActivity extends AppCompatActivity {
private final int RESULT_CODE_FROM_SUBACTIVITY = 96201;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(INTENT_ACTION);
setResult(RESULT_CODE_FROM_SUBACTIVITY, intent);
}
}
*다만 ActivityResultLauncher를 이용할 경우,
Activity의 경우에는 onCreate에,
Presenter 등의 경우에는 onAttach에,
Fragment의 경우에는 initialization에서
registerForActivityResult를 호출해야 한다고 정의되어 있다. (이외의 시점에서 호출할 경우 에러 발생)
이 내용에 관해선 아래 사이트에서 자세하게 확인 할 수 있다.
https://developer.android.com/training/basics/intents/result
활동에서 결과 가져오기 | Android 개발자 | Android Developers
활동에서 결과 가져오기 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를
developer.android.com
(참조 사이트)
Activity Result에 콜백 등록결과를 얻기 위해 활동을 시작할 때, 메모리 부족으로 인해 프로세스와 활동이 소멸될 수 있습니다(특히, 카메라 사용과 같이 메모리를 많이 사용하는 작업의 경우 소멸 확률이 매우 높음).따라서, Activity Result API는 다른 활동을 실행하는 코드 위치에서 결과 콜백을 분리합니다. 결과 콜백은 프로세스와 활동을 다시 생성할 때 사용할 수 있어야 하므로 다른 활동을 실행하는 로직이 사용자 입력 또는 기타 비즈니스 로직을 기반으로만 발생하더라도 활동이 생성될 때마다 콜백을 무조건 등록해야 합니다. |
=> 간단히 요약하면 활동을 시작할 때, 메모리 이슈가 발생하여 ActivityResultLauncher 를 호출한 액티비티가 소멸될 수 있다는 것이다. 따라서 소멸이 되더라도 액티비티가 다시 실행될 경우 무조건 등록 되어야 하기 때문에 호출 가능한 시점을 미리 정해둔 것이라고 할 수 있다.
'JAVA > Android' 카테고리의 다른 글
[JAVA][Android] Bundle로 클래스 객체 전달하기 (0) | 2022.07.26 |
---|---|
[JAVA][Android] JSON / GSON / JACKSON (0) | 2022.07.21 |
[JAVA][Android] 데이터 직렬화 (Serialize) (0) | 2022.07.18 |
[JAVA][Android] 액티비티 종료 전 주요 데이터를 Bundle에 저장하여 재활용하기 (0) | 2022.06.21 |
[JAVA][Android] ImageView 영역에 원하는 radius값을 반영하는 setOutlineProvider (0) | 2022.06.21 |