Как я могу использовать org.jetbrains.anko.startActivity для оптимизации функции startActivity?

Я прочитал статью https://github.com/Kotlin/anko/wiki/Anko-Commons-%E2%80%93-Intents.

я могу использовать startActivity(intentFor<SomeOtherActivity>("id" to 5).singleTop()) открыть новую активность.

Код А автоматически конвертируется из Java в Android Studio 3.0.1. Я могу вызвать это с openActivity(applicationContext, UIBuy::class.java),

Как я могу использовать org.jetbrains.anko.startActivity оптимизировать функцию? Спасибо!

Кстати, код B неверен!

Код А

fun openActivity(mContext: Context, myClass: Class<*>) {
    val intent = Intent().setClass(mContext, myClass)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK

    mContext.startActivity(intent)
}

Код Б

fun openActivity(mContext: Context, myClass: Class<*>) {   
    startActivity<myClass>().FLAG_ACTIVITY_NEW_TASK
}

3 ответа

Для оптимизации вы можете использовать этот код:

startActivity(intentFor<YourActivity>().newTask())

Где intentFor это функция от Анко.

Проблема с startActivity() от Anko заключается в том, что он не позволяет устанавливать флаги. Вы можете передавать только параметры, которые будут размещены внутри Bundle. Это реализация этой функции:

inline fun <reified T: Activity> Context.startActivity(vararg params: Pair<String, Any?>) =
        AnkoInternals.internalStartActivity(this, T::class.java, params)

И internalStartActivity использует внутренний метод createIntent, заполненный "params". Итак, как вы можете видеть, вы должны предоставить Намерение самостоятельно.

РЕДАКТИРОВАТЬ:

Чтобы создать метод openActivity, вы можете использовать встроенный метод, чтобы позволить вам использовать обобщения класса.

Как было отмечено в комментариях, существуют разные способы передачи контекста:

(функция расширения контекста)

inline fun <reified T : Activity>Context.openActivity() {
    startActivity(intentFor<T>().newTask())
}

или (передать контекст в качестве параметра)

inline fun <reified T : Activity>openActivity(context: Context) {
    context.startActivity(intentFor<T>().newTask())
}

или (используйте внутри родительской активности, если у вас есть такая)

inline fun <reified T : Activity>openActivity() {
    startActivity(intentFor<T>().newTask())
}

Здесь вы найдете больше о встроенных функциях и параметризованных типовых параметрах. Но, как видите, предлагаемое решение очень похоже на оригинальные методы Anko.

Прежде всего, код B (startActivity<myClass>()) не компилируется, потому что вы не можете написать Class объект как имя типа для универсального.

Вы не можете использовать org.jetbrains.anko.startActivity если вы хотите установить флаги для вашего намерения. Зачем? Если вы проверяете файл Intents.kt из anko-commons-0.10.4-sources.jar, вы увидите, что функции расширения startActivity только принять Pairs, которые являются именами и значениями, которые вы хотите добавить в свои намерения.

Тем не менее, вы можете упростить ваш код, если вы используете функцию расширения org.jetbrains.anko.newTaskэто синтаксис сахара для addFlags(Intent.FLAG_ACTIVITY_NEW_TASK):

fun openActivity(mContext: Context, myClass: Class<*>) =
    mContext.startActivity(Intent().setClass(mContext, myClass).newTask())

Затем вы можете сделать openActivity(applicationContext, UIBuy::class.java),

Я делаю это:

application.intentFor<AuthActivity>()
                .clearTop()
                .newTask()
                .also(application::startActivity)
Другие вопросы по тегам