Android 如何使用org.jetbrains.anko.startActivity优化startActivity功能?
我读过这篇文章 我可以使用Android 如何使用org.jetbrains.anko.startActivity优化startActivity功能?,android,kotlin,anko,Android,Kotlin,Anko,我读过这篇文章 我可以使用startActivity(intentFor(“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:
startActivity(intentFor(“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)
}
有趣的openActivity(mContext:Context,myClass:Class){
val intent=intent().setClass(mContext,myClass)
intent.flags=intent.FLAG\u活动\u新任务
mContext.startActivity(意图)
}
代码B
fun openActivity(mContext: Context, myClass: Class<*>) {
startActivity<myClass>().FLAG_ACTIVITY_NEW_TASK
}
有趣的openActivity(mContext:Context,myClass:Class){
startActivity().标记活动新任务
}
要实现优化,您可以使用以下代码:
startActivity(intentFor<YourActivity>().newTask())
startActivity(intentFor().newTask())
其中intentFor是来自Anko的功能
Anko的startActivity()的问题在于它不允许您设置标志。您只能传递要放置在捆绑包中的参数。这是此功能的实现:
inline fun <reified T: Activity> Context.startActivity(vararg params: Pair<String, Any?>) =
AnkoInternals.internalStartActivity(this, T::class.java, params)
inline fun Context.startActivity(vararg参数:Pair)=
internalStartActivity(this,T::class.java,params)
internalStartActivity使用内部createIntent方法填充“参数”。所以正如你所看到的,你必须自己提供意图
编辑:
要创建openActivity方法,可以使用内联方法来使用类泛型
正如评论中所提到的,传递上下文有不同的方式:
(语境的扩展功能)
inline fun Context.openActivity(){
startActivity(intentFor().newTask())
}
或
(将上下文作为参数传递)
inline-fun-openActivity(上下文:上下文){
context.startActivity(intentFor().newTask())
}
或
(如果有,请在父活动内部使用)
inline fun openActivity(){
startActivity(intentFor().newTask())
}
您将找到有关内联函数和具体化类型参数的更多信息。但正如您所看到的,建议的解决方案与最初的Anko方法非常相似。首先,代码B(startActivity()
)无法编译,因为您无法将类
对象作为泛型的类型名称编写
如果您想为您的意图设置标志,则不能使用org.jetbrains.anko.startActivity
。为什么?如果您检查anko-commons-0.10.4-sources.jar
的文件Intents.kt
,您将看到函数扩展名startActivity
只接受Pair
s,它们是您希望作为额外内容放入意图中的名称和值
但是,如果使用扩展函数org.jetbrains.anko.newTask
,可以简化代码,这是addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK)
:
有趣的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)
application.intentFor()
.clearTop()
.newTask()
.另外(应用程序::startActivity)
您不能在函数openActivity
内部使用扩展函数intent,因为您不知道类型(除非您使用泛型修改openActivity
)。我认为@hellocw希望将代码提取到函数中,以避免每次调用newTask()
。请参阅我编辑的答案。我还意识到@hellocw希望将其提取为函数。您可以使用reifield轻松完成此操作。这是KotlinOK非常好的特性。但是您需要一个上下文
才能调用startActivity
。您可以使用Context.openActivity
@JavierSA将函数转换为扩展函数。我编辑了我的答案,以显示传递上下文的不同方法。我认为这有点多余,但也许有人会利用它。
inline fun <reified T : Activity>openActivity(context: Context) {
context.startActivity(intentFor<T>().newTask())
}
inline fun <reified T : Activity>openActivity() {
startActivity(intentFor<T>().newTask())
}
fun openActivity(mContext: Context, myClass: Class<*>) =
mContext.startActivity(Intent().setClass(mContext, myClass).newTask())
application.intentFor<AuthActivity>()
.clearTop()
.newTask()
.also(application::startActivity)