Передача данных между Activity

Intent

Intent –  это объект представляющий намерение приложения что-то сделать. Вы можете использовать намерения для самых разных задач, но на этом уроке ваше намерение запускает другое Activity.  С помощью Intent мы можем не только запускать другое Activity но и передавать данные на это Activity. 

val intent = Intent(this, TestActivity1::class.java).apply {
            putExtra
("key", message)
       
}
        startActivity
(intent)

Для запуска нового Activity нам нужно создать Intent используя конструктор Intent который принимает два значения.

  1. Context это первый параметр так как Activity это подкласс класса Context.
  2. Класс в который хотим передать Intent. В нашем случае это Activity которое хотим запустить. 

putExtra это метод с помощью которого мы можем вложить в Intent данные для передачи. Метод putExtra принимает два значения:

  1. Ключ по которому мы будем получать переданное значение на другом Activity. Ключ это любое значение типа String
  2. Значение это любой тип данных таких как , Boolean, String, Int, Float, Double, Char и.т.д

Возврат результата на первое Activity

Когда мы запускаем новое Activity мы можем ждать какого либо результата из второго Activity. Для того чтобы получить результат из второго Activity нам нужно запускать второе Activity с помощью startActivityForResult. Таким образом наше первое Activity будет ждать результата из второго Activity. Как только второе Activity будет закрыто и мы вернемся на наше первое Activity если мы запустили второе Activity с помощью startActivityForResult, на первом Activity запуститься метод onActivityResult в котором мы можем принять ответ или какой либо результат из второго Activity. Для этого нам нужно добавить в наше первое Activity метод onActivityResult. Для того чтобы отправить из второго Activity ответ на первое Activity перед запуском команды finish() нам нужно написать команду setResult(RESUL_OK, intent). Intent мы можем создать сами:

val i = Intent()
i.putExtra("key","message")
setResult(RESULT_OK, i)

или воспользоваться тем который получили с первого Activity просто написав слово intent. Это будет выглядеть вот так:

intent.putExtra("key","message")
setResult(RESULT_OK, intent)

message это сообщение которое хотим передать на первое Activity и key это ключевое слово по которому хотим получить результат.

Когда мы запускаем второе Activity с помощью startActivityForResult нам нужно передать два значения в данный метод.

  1. Intent который хотим передать
  2. requestCode это любое целое число которое будет как id нашего Intent. Он нужен для того чтобы когда мы получим ответ из второго Activity мы знали от какого Activity пришёл ответ, так как мы можем запустить разные Activity и нам нужно знать какое Activity отправило результат. Это requestCode мы будем сверять в методе onActivityResult

вот простой пример запуска второго Activity и ожидание результата:

startActivityForResult(intent, 100)

Получение данных из Intent

Когда мы отправили Intent для запуска второго Activity то когда Activity откроется мы можем сразу например в методе onCreate получить Extra которые были вложены в этот Intent таким способом:

val message = intent.getStringExtra("key")

нам просто нужно указать ключ под которым мы отправили это значение и использовать метод для получения в зависимости от получаемых данных, в данном случае если отправляем String то и получаем getStringExtra.

Когда мы получаем ответ на первом Activity то мы получаем этот ответ в методе onActivityResult:

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

if(requestCode == 100 && resultCode == RESULT_OK && data != null){

val message = data.getStringExtra("key")

}

}

обратите внимание , единственный код который мы написали это условие if и его содержимое, все остальное создается автоматически когда пишем onActivityResult.

мы просто проверяем что это наш requestCode о котором написано выше, и проверяем что на втором Activity мы выбрали RESULT_OK, и проверяем что наш Intent не равен null. Нам приходит Intent это в данном случае переменная data. Если все эти условия верны то мы можем из data получить Extra которые передали из второго Activity.

4 комментария для “Передача данных между Activity”

  1. Хочу добавить еще одно значение для передачи. Мне надо передать несколько переменных из второй активити. Но не получается. Вот код:
    class TestActivity : AppCompatActivity() {
    @SuppressLint(“MissingInflatedId”)
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_test2)

    val message=intent.getStringExtra(“key”)
    val t:TextView=findViewById(R.id.tvMessage)
    t.text=message
    /* val message1=intent.getStringExtra(“key1”)
    val t1:TextView=findViewById(R.id.tvMessage2)
    t1.text=message1*/
    }
    fun onClickBack(view: View){
    val name:EditText=findViewById(R.id.edName)
    intent.putExtra(“key2”,name.text.toString())
    setResult(RESULT_OK,intent)
    finish()
    /* val family:EditText=findViewById(R.id.edFamily)
    intent.putExtra(“key3”,family.text.toString())
    setResult(RESULT_OK,intent)
    finish()*/
    }
    }

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

    val message=intent.getStringExtra(“key”)
    val t1: TextView =findViewById(R.id.tvMes)
    t1.text=message
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode==100 && resultCode== RESULT_OK && data!=null){
    val t1: TextView =findViewById(R.id.tvMes)
    t1.text=data.getStringExtra(“key2”)
    }
    /* if(requestCode==101 && resultCode== RESULT_OK && data!=null){
    val t2: TextView =findViewById(R.id.tvMes2)
    t2.text=data.getStringExtra(“key3”)
    }*/
    }

    fun onClickTest(view: View){
    val i=Intent(this,TestActivity::class.java)
    i.putExtra(“key”,”Привет, как тебя зову?”)
    startActivityForResult(i,100)
    /* val j=Intent(this,TestActivity::class.java)
    j.putExtra(“key1″,”Как твоя фамилия?”)
    startActivityForResult(i,101)*/
    }
    }

Добавить комментарий для Анон Отменить ответ

Ваш адрес email не будет опубликован.