Deperecated/Android_강의

안드로이드 - OnResultActivity

누알라리 2020. 2. 18. 01:27
1. startActivityForResult

- Activity에서 다른 Activity를 실행하고 다시 돌아왔을 때 어떤 처리가 필요하다면 Activity를 실행할 때 startActivity가 아닌 startActivityForResult 메서드를 사용한다.

 

  1. 나는 그냥 다른 액티비티만 실행하면돼! -> startActivity
  2. 아니 나는 다른 액티비티 실행했다가 다시 돌아와서 뭔가 수행해야돼 -> startActivityForResult
2. onActivityResult

- startActivityForResult 메서드를 이용해 Activity를 실행하고 돌아오면 자동으로 onActivityResult 메서드가 호출된다. 여기에서 필요한 작업을 처리하면 된다.

 

- 매개변수

1.  requestCode : Main Activity에서 갔다가 돌아온 Activity가 여러개 일 수 있기 때문에 그걸 구분해주기 위해 사용하는 코드. 어떤 액티비티에서 finish하고 돌아왔는지 구분해주기 위한 코드.

2.  resultCode : 다른 activity로 들어가서 작업을 했고, 그 작업의 결과가 어떤지 알려주는 코드. 작업하는 액티비티에서 setResult()로 설정 가능.

 

    // 4.
    // startActivityForResult()로 SecondActivity를 실행시켰기 때문에 거기서 finish()하고 돌아왔을 때 자동으로 이 함수가 호출.

    // requestCode : Main Activity에서 갔다가 돌아온 Activity가 여러개 일 수 있기 때문에 그걸 구분해주기 위해 사용하는 코드. 어떤 액티비티에서 finish하고 돌아왔는지 구분해주기 위한 코드.
    // resultCode : 다른 activity로 들어가서 작업을 했고, 그 작업의 결과가 어떤지 알려주는 코드. 작업하는 액티비티에서 setResult()로 설정 가능.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when(requestCode)
        {
            SECOND_ACTIVITY ->
            {
                textView.text = "세컨액티비티에서 돌아옴"

                // 7. 전달받은 resultCode로 분기 가능.
                when(resultCode)
                {
                   Activity.RESULT_OK -> {
                       textView.text = "asdsad"
                    }
                    Activity.RESULT_CANCELED -> {
                        textView.text = "asdasd"
                    }
                    Activity.RESULT_FIRST_USER -> {
                        textView.text = "asda"
                    }
                }
            }

            THIRD_ACTIVITY -> {
                textView.text = "서드액티비티에서 돌아옴"
            }
        }

    }

 

예제
main


class MainActivity : AppCompatActivity() {

    // 6. 상수 정의
    private val SECOND_ACTIVITY = 1
    private val THIRD_ACTIVITY = 2

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

        // 1. 버튼을 눌러서 두번째 액티비티를 실행시킨다.
        button2.setOnClickListener { view ->

            // 2. 인텐트 객체 생성
            var intent = Intent(this, SecondActivity::class.java)

            // 3. 이 Intent를 실행시켜줘! 안드로이드os야!
            startActivityForResult(intent, SECOND_ACTIVITY)
        }

        button3.setOnClickListener {  view ->

            // 5. 서드액티비티로 이동하는 인텐트
            var intent = Intent(this, ThirdActivity::class.java)
            startActivityForResult(intent, THIRD_ACTIVITY)
        }
    }


    // 4.
    // startActivityForResult()로 SecondActivity를 실행시켰기 때문에 거기서 finish()하고 돌아왔을 때 자동으로 이 함수가 호출.

    // requestCode : Main Activity에서 갔다가 돌아온 Activity가 여러개 일 수 있기 때문에 그걸 구분해주기 위해 사용하는 코드. 어떤 액티비티에서 finish하고 돌아왔는지 구분해주기 위한 코드.
    // resultCode : 다른 activity로 들어가서 작업을 했고, 그 작업의 결과가 어떤지 알려주는 코드. 작업하는 액티비티에서 setResult()로 설정 가능.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when(requestCode)
        {
            SECOND_ACTIVITY ->
            {
                textView.text = "세컨액티비티에서 돌아옴"

                // 7. 전달받은 resultCode로 분기 가능.
                when(resultCode)
                {
                   Activity.RESULT_OK -> {
                       textView.text = "asdsad"
                    }
                    Activity.RESULT_CANCELED -> {
                        textView.text = "asdasd"
                    }
                    Activity.RESULT_FIRST_USER -> {
                        textView.text = "asda"
                    }
                }
            }

            THIRD_ACTIVITY -> {
                textView.text = "서드액티비티에서 돌아옴"
            }
        }

    }
}
second

class SecondActivity : AppCompatActivity() {

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


        button7.setOnClickListener { view ->

            // 7.
            // setResult()를 통해 resultCode를 전달할 수 있다.
            setResult(Activity.RESULT_OK)
            finish()
        }

        button8.setOnClickListener { view ->
            setResult(Activity.RESULT_CANCELED)
            finish()
        }

        button9.setOnClickListener { view ->
            setResult(Activity.RESULT_FIRST_USER)
            finish()
        }
    }
}
Third

class ThirdActivity : AppCompatActivity() {

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

        button4.setOnClickListener { view ->
            finish()
        }
    }
}