Казалось бы: что такого сложного в Intent ?

Но есть нюансы. Объявляется Intent, вызывается startActivity с ним и всё. Ну или с добавлением extra. Тоже несложно. Или нет?

val badIntent = Intent(this, SomeActivity::class.java)
badIntent.putExtra("KEY_NAME", "Mike")
badIntent.putExtra("KEY_AGE", 29)
startActivity(badIntent)

Во второй activity забираем:

val name = intent.getStringExtra("KEY_NAME")
val age = intent.getIntExtra("KEY_AGE", 0)

И всё. Но! Сколько же тут подводных камней. Во-первых, можно допустить ошибку в написании имени ключа, хотя эту проблему можно устранить с помощью констант. Но во-вторых, можно изменить количество или тип передаваемых параметров в одной из activity и забыть поменять их в другой (или пятой, мало ли, сколько их там вызывает эту SomeActivity — одну обязательно забудешь). Тут стоит использовать приём, при котором вызываемая activity сама знает, как её нужно вызывать и какие параметры ей требуются:

companion object {

    private const val NAME = "KEY_NAME"
    private const val AGE = "KEY_AGE"

    fun getCallingIntent(context: Context, name: String, age: Int): Intent {
        val intent = Intent(context, SomeActivity::class.java)
        with(Bundle()) {
            putString(NAME, name)
            putInt(AGE, age)
            intent.putExtras(this)
        }
        return intent
    }
}

val name = intent.extras.getString(NAME)
val age = intent.extras.getInt(AGE)

Теперь эта SomeActivity имеет метод getCallingIntent, который принимает context и все параметры, которые ей требуются. Возвращает он готовый intent. Вызывая такой метод из первой activity, никак невозможно пропустить какой-то параметр или указать неверный ключ, такой неправильный код просто не скомпилируется. Вот как теперь выглядит вызов:

startActivity(SomeActivity.getCallingIntent(
        context = this,
        name = "Mike",
        age = 29))

Проще простого!

Добавить комментарий

Закрыть меню