기존에 잘 사용해오던 startActivitForResult가 deprecated 되었습니다.
해당 함수가 deprecated 된 이유로는 결과를 받아서 실행하는 Activity에서 메모리 부족으로
인해서 프로세스와 Activity가 사라질 수 있기 때문에 이에 대응하기 위해서
기존에 처리방식을 버리고 Result Callback을 등록해서 사용하는 방식으로 변경되었습니다.
물론 위 함수를 사용할 수 없는것은 아니지만 권장하지 않으며
해당 함수를 통해 어플에 문제가 발생할 수 있음을 인지하여야 합니다.
먼저 기존에 startActivityForResult를 실행하던 것을 변경해 보도록 하겠습니다.
결과를 받아올 곳을 MainActivity
실행하여 결과를 보낼 곳을 LoadingActivity라고 가정하겠습니다.
MainActivity
private ActivityResultLauncher<Intent> resultLauncher;
변경된 방식에서는 resultLauncher를 통해서 콜백 함수를 정의합니다.
MainActivity onCreate()
resultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode()==0){
Log.i("디버깅","디버깅 확인");
}
}
});
다음으로 onCreate 내에 콜백을 구현합니다.
저는 LoadingActivity의 로딩이 완료되면 resultcode를 0으로 보냈습니다.
MainActivity onCreate()
Intent loading_intent = new Intent(MainActivity.this,LoadingActivity.class);
resultLauncher.launch(loading_intent);
원하는 위치에서 resultLauncher을 통해 LoadingActivity를 실행하여 줍니다.
마지막으로 LoadingActivit에서는 setResult를 통해 콜백 함수에 값을 전달합니다.
LoadingActivity
public class LoadingActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_page);
new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
setResult(0);
finish();
}
}.sendEmptyMessageDelayed(0,3000);
}
}
보통 resultLauncher 콜백은 하나만 구현하여 내부에서 resultcode로 분류합니다.
resultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode()==0){
Log.i("디버깅","로딩 페이지 콜백");
}else if(result.getResultCode()==1){
Log.i("디버깅","로그인 페이지 콜백");
}
}
});
댓글