Android中启动Activity的最佳写法

发布时间 2023-06-14 17:21:00作者: Devil'soul

问题思考

在实际工作场景中,大家各个模块都是有交互的,那么就存在各个模块Activity的相互跳转。假设小A负责一个ActivityA,所有跳转到ActivityA的请求都需要携带String类型的参数resaon,那么每一个对接跳转到ActivityA的业务,小A都要说一遍:“跳转过来需要带一个参数reason”,很明显这种工作效率是很低的。而且更为麻烦的是,如果小A这里的业务变了,除了reason参数还需要额外传递一个packageName参数,那么怎么更简单有效的告知所有跳转过来的用户呢?

解决方案

ActivityA中定义一个跳转到自身的公共方法。

代码实现

假设现在有一个核心Activity:MainActivity.kt

class MainActivity : AppCompatActivity() {

    companion object {
        //@JvmStatic
        fun startSecondActivity (context: Context, reason: String, packageName: String) {
var intent
= Intent(context, MainActivity::class.java) intent.putExtra("reason", reason) intent.putExtra("packageName", packageName) context.startActivity(intent) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val param1 = intent.getStringExtra("reason") val param2 = intent.getStringExtra("packageName") Log.d("MainActivity", "reason: $param1 packageName: $param2") } }

现在有一个UserActivity要跳转到MainActivity

class UserActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val btn = findViewById<Button>(R.id.btn)
        btn.setOnClickListener {
            SecondActivity.startSecondActivity(this, "pass", "com.security.user")
        }
    }
}

可以看到我们在MainActivity通过companion object定义了一个"静态方法",任何要跳转到MainActivity的Activity,只需要调用startSecondActivity方法即可,按照方法定义要求传入对应的参数,即可实现Activity跳转规则的标准化。

注意事项

需要注意的是:如果你的UserActivity不是kotlin类,而是java类,那么你就不能直接用类名调用方法:SecondActivity.startSecondActivity。因为Kotlin知道companion object中的函数,因此可以直接在类上调用它,而Java对此一无所知。解决方法是在方法上使用@JvmStatic注解,这样Java类中的代码就可以识别该方法为"静态方法"。