如何使用org.jetbrains.anko.startActivity来优化startActivity函数?

时间:2018-03-26 02:10:04

标签: android kotlin anko

我已阅读文章https://github.com/Kotlin/anko/wiki/Anko-Commons-%E2%80%93-Intents

我可以使用startActivity(intentFor<SomeOtherActivity>("id" to 5).singleTop())打开一个新的活动。

代码A由Android Studio 3.0.1自动转换为Java。我可以使用openActivity(applicationContext, UIBuy::class.java)调用它。

如何使用org.jetbrains.anko.startActivity优化功能?谢谢!

顺便说一下,代码B错了!

代码A

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

    mContext.startActivity(intent)
}

代码B

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

3 个答案:

答案 0 :(得分:3)

为了优化,您可以使用以下代码:

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

其中,intent是Anko的功能。

Anko的startActivity()问题在于它不允许你设置标志。你只能将params传递给Bundle。这是此功能的实现:

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

而且internalStartActivity使用内部createIntent方法填充&#34; params&#34;。所以你可以看到你必须自己提供意图。

编辑:

要创建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())
}

Here您将找到有关内联函数和已知类型参数的更多信息。但正如您所看到的 - 建议的解决方案与原始的Anko方法非常相似。

答案 1 :(得分:0)

首先, Code B startActivity<myClass>())无法编译,因为您无法将Class对象写为泛型类型的名称。

如果要为Intent设置标记,则不能使用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)

答案 2 :(得分:0)

我这样做:

k