출처: https://kimyunseok.tistory.com/40
startActivityForResult() - Deprecated
변경전: A 액티비티와 B 액티비티가 있을 때,
startActivityResult메서드와 onActivityResult메서드를 사용해서 구현할 경우
- A -> B 실행, 메모리가 부족해서 A가 소멸됨.
- B 액티비티 종료 후 setResult() 메서드로 결과값 넘김
- A가 소멸됐다가 다시 생성돼서 B에게 결과값을 요청한 줄 모름.
변경후: ActivityResultLauncher객체와 registerForActivityResult()를 사용한 경우
- A -> B 실행, 메모리가 부족해서 A가 소멸됨.
- 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 -> {
}
}
}
}