728x90

출처: https://kimyunseok.tistory.com/40

 

startActivityForResult() - Deprecated

 

변경전: A 액티비티와 B 액티비티가 있을 때,

startActivityResult메서드와 onActivityResult메서드를 사용해서 구현할 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
  3. A가 소멸됐다가 다시 생성돼서 B에게 결과값을 요청한 줄 모름.

변경후: ActivityResultLauncher객체와 registerForActivityResult()를 사용한 경우

  1. A -> B 실행, 메모리가 부족해서 A가 소멸됨.
  2. B 액티비티 종료 후 setResult() 메서드로 결과값 넘김

A가 다시 생성돼도 registerForActivityResult() 메서드가 다시 콜백을 등록해 줘서 결과값을 받아온다.

 

∴ ActivityResultLauncher객체와 registerForActivityResult()로 구현하면 됨

 

 

 

출처2:https://velog.io/@bonimddal2/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ActivityResultLauncher%EB%A1%9C-startActivityForResult%EC%99%80-requestPermissions-%EB%8C%80%EC%B2%B4%ED%95%98%EA%B8%B0

출처3:https://aal-izz-well.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%BD%94%ED%8B%80%EB%A6%B0-activityResultLauncherActivityForResult-%EB%8C%80%EC%B2%B4

 

우선 implementation을 해준다.

implementation 'androidx.activity:activity:1.3.0-alpha08'
implementation 'androidx.fragment:fragment:1.4.0-alpha01'

==> 나는 아래로 변경함

implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.4.1'


ActivityResultLauncher 사용법은 아래와 같다.

class MainActivity : AppCompatActivity(), View.OnClickListener {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    //ActivityResultLauncher<T>객체를 생성해주고 초기화 해준다.
    //T는 내가 호출할 엑티비티에서 결과값으로 받아올 자료형을 말한다.
    lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
    val TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.btnMain.setOnClickListener(this)

        //RegisterActivityResult(Contract자료형, 콜백메서드)를 이용해서
        //ActivityResultLauncher를 초기화 해준다.
        activityResultLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult())
            {//Result 매개변수 콜백 메서드
                //ActivityResultLauncher<T>에서 T를 intent로 설정했으므로
                //intent자료형을 Result 매개변수(콜백)를 통해 받아온다
                //엑티비티에서 데이터를 갖고왔을 때만 실행
                if (it.resultCode == RESULT_OK) {
                    //SubActivity에서 갖고온 Intent(It)
                    val myData: Intent? = it.data
                    val address = it.data?.getStringExtra("KEY1") ?: ""
                    Log.e(TAG, address)
                }
            }


    }


    override fun onClick(v: View?) {

        when (v?.id) {
            //버튼을 누르면 메뉴 엑티비티가 실행되게 하였다.
            //launch메서드를 이용해 intent를 실행하고 새 엑티비티로부터 응답을받는다.
            //그리고 RequestCode가 사라졌다.
            binding.btnMain.id -> {
                val intent = Intent(applicationContext, SubActivity::class.java)
                activityResultLauncher.launch(intent)
            }

            else -> {


            }
        }


    }


}

 

class SubActivity : AppCompatActivity(), View.OnClickListener {
    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        binding.btnSub.setOnClickListener(this)
    }


    //버튼 클릭 리스너 메서드
    override fun onClick(v: View?) {
        when (v?.id) {
            binding.btnSub.id -> {
                val intent = Intent(applicationContext, MainActivity::class.java).apply {
                    //엑티비티에서 갖고올 데이터
                    putExtra("KEY1", "bbbbb")
                    //데이터 전달이 성공했을 때의 변수 값 저장
                    // Result_ok = -1 일 때 엑티비티에 전달된다.

                }
                setResult(RESULT_OK, intent)
                //엑티비티 종료
                if (!isFinishing) finish()
            }
            else -> {
            }
        }
    }

}

 

 

728x90

+ Recent posts