ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • back 버튼 두 번 클릭하여 프래그먼트에서 액티비티 종료시키기
    Android Studio 2023. 7. 10. 22:56
    728x90

    자료출처 : https://developer.android.com/guide/navigation/navigation-custom-back?hl=ko

     

    상황 전제
    1. 안드로이드 버전 12 이상 (onBackPressed ->  사용할 수는 있으나, deprecation 된 상태)
    2. 액티비티2가 실행되고나서 Back 버튼을 눌러도 액티비티1로 돌아가지 않게 하고 싶을 때
     
    액티비티1이 관리하는 프래그먼트에서 액티비티2 호출하며, 액티비티1  Intent.flag를 사용하여 액티비티 새로운 테스크 를 사용 혹은 현재 액티비티 백스택을 클리어 (공부중이라 정확한 의미가 아닐수도..?)
    찝찝하다면 or 대신 and를 작성하여 새로 생성한 다음 혹시 모를게 남아 있을 수 있으니 클리어까지...

    fragmentLoginBinding = FragmentLoginBinding.inflate(inflater)
    mainActivity = activity as MainActivity
    
    fragmentLoginBinding.run{
        editTextLoginPassword.run{
            setOnEditorActionListener { v, actionId, event ->
                mainActivity.removeFragment(MainActivity.LOGINFRAGMENT)
                val intent = Intent(mainActivity, MainActivity2::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                startActivity(intent)
                false
            }
        }
    }

    프래그먼트에서 쓰레드를 이용하여 상태값을 변경시키고 3초 내 백 버튼을 누르는 이벤트가 2번 발생하면 해당 액티비티를 Compat에서 지원하는 메서드를 이용하여 액티비티2 종료 -> 액티비티1 종료된 상태이기에 어플리케이션 종료.
     
     

    mainActivity2 = activity as MainActivity2
    
    var shoutDownCheck = false
    requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // 뒤로가기 눌렀을 때 동작할 코드
            if(shoutDownCheck){
    
                ActivityCompat.finishAffinity(mainActivity2)
    
            } else {
                shoutDownCheck = true
                Toast.makeText(requireActivity(),"종료하시려면 한번 더 눌러주세요", Toast.LENGTH_SHORT).show()
                thread {
                    SystemClock.sleep(3000)
                    shoutDownCheck = false
                }
            }
        }
    })

     
    requireActivity() : 현재 프래그먼트를 관리하는 액티비티를 의미합니다.
    상기 코드 내에서는 mainActivity2로 작성하여도 무관합니다.
     
     

Designed by Tistory.