Search code examples
androidkotlinandroid-activity

Send data back from one activity to another ANDROID KOTLIN


I have this situation.

Let's say I have 3 activities A B & C

From Activity A y open B

I perform certain validations on B and the presents B finishing B using finish()

In C I get the values needed to get back to activity A with a result that I need to display on A.

I did this:

On activity A:

   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    if(requestCode == startValidationActivityCode){
        val message = data!!.getStringExtra("message")
        Toast.makeText(this, message, Toast.LENGTH_LONG).show()
    }else{
        super.onActivityResult(requestCode, resultCode, data)
    }
}

I do nothing on activity B

Then in activity C I have the following, where $scannedQTY is the value I need on Activity A:

    override fun onBackPressed() {
    sendDataToPreviousActivity()
    super.onBackPressed()
}

private fun sendDataToPreviousActivity(){
    val intent = Intent().apply {
        putExtra("message", "This is the qty $scannedQTY")
    }
    setResult(Activity.RESULT_OK, intent)
}

But I get this error:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=0, data=null} to activity

Any help will be really appreciate it.

Thank you folks!!!


Solution

  • If you open activities like this: A -> B -> C, and want to retrieve result in activity A from activity C you need to do next steps:

    1. Use some common REQUEST_CODE variable, e.g. const val REQUEST_CODE: Int = 400
    2. In activity A start activity B using method startActivityForResult(intent, REQUEST_CODE);
    3. In activity A override onActivityResult() method:

      override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
      
          if (requestCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
              val message = data!!.getStringExtra("message")
              Toast.makeText(this, message, Toast.LENGTH_LONG).show()
          } else {
              super.onActivityResult(requestCode, resultCode, data)
          }
      }
      
    4. In activity B start activity C using method startActivityForResult(intent, REQUEST_CODE);

    5. In activity B override onActivityResult() method:

      override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
      
          if (requestCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
              makeValidations()
      
              // pass data back to activity A
              setResult(Activity.RESULT_OK, data)
              finish()
          } else {
              super.onActivityResult(requestCode, resultCode, data)
          }
      }
      
    6. In activity C to pass data back to activity B:

      val intent = Intent().apply {
          putExtra("message", "This is the qty $scannedQTY")
      }
      setResult(Activity.RESULT_OK, intent)
      finish()