본문 바로가기
카테고리 없음

startActivityForResult deprecated 대응

by 코딩히어로 2022. 4. 6.
728x90

기존에 잘 사용해오던 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("디버깅","로그인 페이지 콜백");
        }
    }
});
728x90
반응형

댓글