본문 바로가기
안드로이드 코틀린

[kotlin][Android] Activity 한번에 종료하기

by teamnova 2022. 6. 28.

이번 시간에는 activity를 여러개 쌓은 후, 마지막 것을 기준으로 한번에 종료하는 기능을 만들어보겠습니다.

해당 기능을 구현하는 방법은 여러가지가 있습니다. 

하지만 그것들 중에서 ActivityResultLauncher<Intent> 를 사용할 것 입니다.

원리는 간단합니다. launcher을 통해 activity를 실행시킨후, 던진 데이터가 finish이면 종료시킵니다.

이를 위해선 매 activity launcher가 필요하므로 BaseLauncherActivity를 만들어 상속해줍시다.


open class BaseLauncherActivity : AppCompatActivity() {

    protected lateinit var launcher: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        launcher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
                if (result.resultCode == RESULT_OK) {
                    val data = result.data
                    setResult(RESULT_OK, data)
                    finish()
                }
            }
    }
}

 

MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var launcher: ActivityResultLauncher<Intent>
    private lateinit var tv : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tv = findViewById(R.id.result)

        findViewById<Button>(R.id.button2).setOnClickListener {
            val intent = Intent(baseContext, Signup1Activity::class.java)
            launcher.launch(intent)
        }

        launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
            if (result.resultCode == RESULT_OK) {
                val data = result.data

                tv.text = "id : ${data?.getStringExtra("id")}\npassword : ${data?.getStringExtra("id")}\n소개말 : ${data?.getStringExtra("description")}"
            }
        }
    }
}

 

class Signup1Activity : BaseLauncherActivity() {
    private lateinit var et : EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.signup1_activity)
        et = findViewById(R.id.editText)


        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(baseContext, Signup2Activity::class.java)
            intent.putExtra("id", et.text.toString())
            launcher.launch(intent)
        }
    }
}
class Signup2Activity : BaseLauncherActivity() {

    private lateinit var et : EditText
    private lateinit var id : String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.signup2_activity)


        if (intent.hasExtra("id")) {
            id = intent.getStringExtra("id")!!
        } else {
            finish()
        }


        et = findViewById(R.id.editText)


        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(baseContext, Signup3Activity::class.java)
            intent.putExtra("id", id)
            intent.putExtra("password", et.text.toString())
            launcher.launch(intent)
        }
    }
}

 

class Signup3Activity : BaseLauncherActivity() {

    private lateinit var et : EditText
    private lateinit var id : String
    private lateinit var password : String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.signup3_activity)
        et = findViewById(R.id.editText)


        if (intent.hasExtra("id") && intent.hasExtra("password")) {
            id = intent.getStringExtra("id")!!
            password = intent.getStringExtra("password")!!
        } else {
            finish()
        }


        findViewById<Button>(R.id.button).setOnClickListener {
            val data = Intent()
            data.putExtra("id", id)
            data.putExtra("password", password)
            data.putExtra("description", et.text.toString())
            data.putExtra("finish", true)
            setResult(RESULT_OK, data)
            super.finish()
        }
    }
}

 

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="가입해주세요."
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="44dp"
        android:text="가입"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/result" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

signup1_activity.xml

<!-- signup1_activity -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Signup1Activity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="68dp"
        android:text="다음"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="60dp"
        android:text="아이디"
        app:layout_constraintEnd_toStartOf="@+id/editText"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="30dp"
        android:hint="아이디"
        app:layout_constraintBottom_toBottomOf="@+id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toTopOf="@+id/textView2" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

signup2_activity

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Signup1Activity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="68dp"
        android:text="다음"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="60dp"
        android:text="비밀번호"
        app:layout_constraintEnd_toStartOf="@+id/editText"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="30dp"
        android:inputType="textPassword"
        android:hint="비밀번호"
        app:layout_constraintBottom_toBottomOf="@+id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toTopOf="@+id/textView2" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

signup3_activity

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Signup1Activity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="68dp"
        android:text="완료"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:text="자기 소개"
        app:layout_constraintBottom_toBottomOf="@+id/editText"
        app:layout_constraintEnd_toStartOf="@+id/editText"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/editText" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="36dp"
        android:layout_marginEnd="30dp"
        android:hint="자기소개"
        android:inputType="text|textMultiLine"
        android:lines="20"
        android:scrollbars="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

>> 결과물

결과물

=