ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android]startActivity()와 startActivityForResult() 차이.
    Android 2019. 5. 7. 17:08

    안드로이드에서 화면 전환할 때 사용하는 startActivity()와 startActivityForResult()에 대하여 알아보겠습니다.

    해당 예제 코드는 Kotlin을 이용하였습니다. 

     

    startactivity()와 startActivityForResult()를 알기에 앞서,

    각 함수의 파라미터로 들어가는 intent에 대하여 알고 넘어가겠습니다.


    Intent 

    애플리케이션 구성요소 간에 작업 수행을 위한 정보 전달을 하는 역할을 합니다.

     

    1. 명시적 인텐트

       작업을 수행하길 원하는 컴포넌트를 정확히 지목하는 것을 뜻합니다.
       위와 같이 Intent()라는 객체를 선언하기 위해서는 (위치한 Activity, 가고 싶은 Acitivty )를 적어주면 됩니다. 

     val intent = Intent(this@TestActivity, MainActivity::class.java)
    

    2. 암시적 인텐트

       해당 작업을 할 수 할 수 있는 컴포넌트 전부에게 전달합니다.

      주로 공유하기 버튼을 누를 때 많이 사용됩니다. 
      해당 URI를 띄울 수 있는 
    앱들이 하단에 나타나며 사용자가 가능한 앱 중 한 가지를 택할 수 있습니다.  

      val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://naver.com"))
    

     

    3. Intent에 data 넣는 방법. 

      intent.putExtra("key", "value")
    

    intent.putExtra("key", value")의 형태로 집어넣습니다. 

    4. Intent에 data 가져오는 법. 

     val intent = intent
     val value = intent.getStringExtra("key")

    코틀린에서는 자동으로 getIntent를 intent라고 보여줍니다.  

    intent 객체를 getIntent 해서 가져온 후,

    해당 intent.getStringExtra("key") 값을 지정하며 어떤 value가 들어있는지 알 수 있습니다. 


    대략적인 intent의 사용법을 알면 이제 새로운 Activity로 화면 전환을 할 수 있습니다.


    StartActivity(intent)

    val intent = Intent(this, MainActivity::class.java)
                 intent.putExtra("MainActivity", "MainActivity")
                 startActivity(intent)

    intent객체를 선언해 줄 때는  this(현재 내가 위치한 Activity)->MainActivity로 간다는 의미로 생성해줍니다. 

    intent객체 안에 putExtra로 "MainActivity"라는 key 값에 "MainActivity" value 값을 넣어서 

    startActivity()로 화면 전환을 시킨 예제 코드입니다. 

     

    StartActivityForResult(intent)

    TestActivity.kt

     private val MAIN_REQUEST_CODE = 100
     private val CONSTELLATION_REQUEST_CODE = 200
     private val NAME_REQUEST_CODE = 300
     private val RESULT_REQUEST_CODE = 400
    
     class TestActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_test)
            setupBtn()
        }
    
        private fun setupBtn() {
            button_main.setOnClickListener {
                val intent = Intent(this@TestActivity, MainActivity::class.java)
                intent.putExtra("MainActivity", "MainActivity")
                Log.d("MainActivity", "${intent.getStringExtra("MainActivity")}")
                startActivityForResult(intent, MAIN_REQUEST_CODE)
            }
    
            button_constellation.setOnClickListener {
                val intent = Intent(this@TestActivity, ConstellationActivity::class.java)
                intent.putExtra("ConstellationActivity", "ConstellationActivity")
                startActivityForResult(intent, CONSTELLATION_REQUEST_CODE)
                //startActivity(intent)
            }
    
            button_name.setOnClickListener {
                val intent = Intent(this@TestActivity, NameActivity::class.java)
                intent.putExtra("NameActivity", "NameActivity")
                startActivityForResult(intent, NAME_REQUEST_CODE)
                //startActivity(intent)
            }
    
            button_result.setOnClickListener {
                val intent = Intent(this@TestActivity, ResultActivity::class.java)
                intent.putExtra("ResultActivity", "ResultActivity")
                startActivityForResult(intent, RESULT__REQUEST_CODE)
                //startActivity(intent)
            }
        }
    
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
            when (requestCode) {
                MAIN_REQUEST_CODE -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")
                        Log.d("onActivityResult", "data is ${data!!.getStringExtra("RESULT")}")
                    } else
                        return
                }
                CONSTELLATION_REQUEST_CODE -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")
                        Log.d("onActivityResult", "data is ${data!!.getStringExtra("RESULT")}")
                    } else
                        return
                }
                NAME_REQUEST_CODE -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")
                        Log.d("onActivityResult", "data is ${data!!.getStringExtra("RESULT")}")
                    } else
                        return
                }
                RESULT__REQUEST_CODE -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")
                        Log.d("onActivityResult", "data is ${data!!.getStringExtra("RESULT")}")
    
                    } else
                        return
                }
    
            }
    
        }
    }
    
    

     위의 코드는 TestActivity()를 만들고 activity_test.xml안에 버튼 4개를 만들어 다른 Acitivty로 가는 것을 보여주는 예제입니다. 

     

    startActivityForResult()를 하기 위해서는 클래스 위의 전역적으로 아래와 같은 REQUEST_CODE 상수를 만들어줘야 합니다

    이 녀석의 역할은 값을 지정하여 내가 보낸 요청이 맞는지 아닌지 판단하는 것입니다.

        private val MAIN_REQUEST_CODE = 100
        private val CONSTELLATION_REQUEST_CODE = 200
        private val NAME_REQUEST_CODE = 300
        private val RESULT_REQUEST_CODE = 400
    

     request_code를 파라미터로 넣어주어 원하는 액티비티로 갔는지 확인할 수 있습니다.

      startActivityForResult(intent, MAIN_REQUEST_CODE)
            

     

    MainAcitivity.kt

    class MainActivity : AppCompatActivity() {
    
        private var value : String? = ""
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            Toast.makeText(this,"여기는 MainActivity",Toast.LENGTH_LONG).show()
            sendIntentInfo()
        }
        
        private fun sendIntentInfo(){
            val intent = intent
            value = intent.getStringExtra("MainActivity")
            Log.d("value", "$value")
    
            intent.putExtra("RESULT","MainActivity 성공")
            setResult(Activity.RESULT_OK,intent)
            Log.d("MainActivity","${intent.getStringExtra("MainActivity")}")
            finish()
        }
    }
    

     위의 코드는 TestActivity에서 MainActivity로 갔을 때 보이는 Activity입니다. 

    startActivity()와 다른 점은 바로

    setResult(Result_Code, intent) 안에 Result Code로 정상적으로 데이터를 받고 보내졌다 확인할 수 있습니다.  

    finish()를 하면 MainActivity()는 자동으로 종료됩니다. 

    그리고 다시 부모 Activity인 TestActivity()로 갑니다.

     

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
            when (requestCode) {
                MAIN_REQUEST_CODE -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")
                        Log.d("onActivityResult", "data is ${data!!.getStringExtra("RESULT")}")
                    } else
                        return
                }

    다시 TestActivity로 돌아와서 onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)를 오버라이드 해줍니다. 

     

    파라미터를 확인해보겠습니다. 

    • requestCode :  앞서 정의해준 상수로 각 액티비에 부여해준 값. 
    • resultCode :  액티비티가 정상적으로 왔는지 확인해주는 값.
    • data :  각 activity에서 받아온 intent들을 뜻합니다. 

    when(requestCode)를 이용하여 

    requestCode를 분기 처리하였고,

    if(resultCode)는 Acitivity.Result_OK로 상태 값을 확인. 

     

    위 코드의 로그 값을 살펴보면 

                     Log.d("onActivityResult", "resultCode is $resultCode request is $requestCode")

                                 "onAcitivityResult resultCode is -1 request is 100"으로 출력됩니다. 

     

     Conclusion                                                                                                               

    • startAcitivity
      child Activity에서의 결과를 Parent Activity에서 처리하지 않아도 될 때 사용합니다. 

    •  startActivityForResult
      Child Activity에서의 결과를 Parent Activity 처리할 때 사용합니다. 
      이를 사용하기 위해서는 Request Code와 Result Code가 필요한데, 
      Request Code는 각 Activity 마다 다르게 지정해 줄 수 있으며 Result
      Code는 ChildActivity에서 setReuslt() 안에 값으로 지정할 수 있습니다.

    관련 내용을 정리 해 놓은 다른 블로그들을 참고로 정리하였으니
    다른 예제도 찾아보는것을 추천합니다! 

     

    ※ Reference

    startActivityForResult() VS startActivity()

    [안드로이드 Intent] startActivity(), startActivityForResult()를 통한 페이지 넘어가기

     
     

                

    LIST

    댓글

Designed by Tistory.