Kotlin中的android Activity静态启动器方法

lel*_*man 5 android kotlin

在Java中,可以为Activity定义一种入门静态方法。在Android Studio中,甚至还有一个“入门”模板:它看起来像这样:

public class MyActivity extends AppCompatActivity {

    private static final String EXTRA_FOO = "foo";

    public static void start(Context caller, String bar){
        Intent intent = new Intent(caller, MyActivity.class);
        intent.putExtra(EXTRA_FOO, bar);
        caller.startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

我用Kotlin围绕着这个相同的概念,我想到的最接近的东西是这样的:

class MyActivity : AppCompatActivity() {

    companion object {
        private val EXTRA_FOO = "foo"

        fun start(caller: Context, bar: String){
            val intent = Intent(caller, MyActivity::class.java)
            intent.putExtra(EXTRA_FOO, bar)
            caller.startActivity(intent)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更简洁,优雅的方法可以做到这一点?我不敢相信这是要走的路,它看起来比Java中的丑陋。另外,没有Kotlin的“入门”模板。

Sam*_*Sam 3

您可以采取几种方法。我是扩展函数的粉丝:

class MyActivity : AppCompatActivity()

private fun Intent.extraFoo(bar : String) = putExtra("foo", bar)

fun Context.startMyActivity(bar : String) =
    Intent(this, MyActivity::class.java).apply { extraFoo(bar) }.let(this::startActivity)
Run Code Online (Sandbox Code Playgroud)

这将创建一个扩展,Context以便您可以调用startMyActivity任何Context对象。


下面是类似 Java 风格的相同扩展函​​数,因此您可以更轻松地将其与已有的扩展函数进行比较:

private val EXTRA_FOO = "foo"

fun Context.startMyActivity(bar : String) {
    val intent = Intent(this, MyActivity::class.java)
    intent.putExtra(EXTRA_FOO, bar)
    startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)