Как я могу использовать 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
только принять Pair
s, которые являются именами и значениями, которые вы хотите добавить в свои намерения.
Тем не менее, вы можете упростить ваш код, если вы используете функцию расширения 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)