先对比kotlin和java中跳转到另一个activity的基本代码:
java:
Intent i = new Intent(OneActivity.this, TwoActivity.class);
startActivity(i);
kotlin:
val i = new Intent(this@OneActivity, TwoActivity::class.java)
startActivity(i)
可能你会觉得kotlin在写法上并没有更简洁,但在引入Anko库之后这两句代码就大大简化了,Anko库的引入在第一篇就提到过了:
startActivity()
如果需要传递数据过去,就可以类似于map映射的写法来传递数据:
startActivity(
"year" to "2018"
"month" to "08"
"day" to "12"
)
或者
startActivity(
Pair("year", "2018")
Pair("month", "08")
Pair("day", "12")
)
无论是哪一种方式,在TwoActivity中数据的解析都是要先获取到Bundle对象:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_one)
val bundle = intent.extras
var year = bundle.getString("year")
var month = bundle.getString("month")
var day = bundle.getString("day")
}
如果说要指定activity的启动方式,我们可以在AndroidManifest.xml文件中对activity进行配置,或者在代码中来指定:
var i = intentFor(
Pair("year", "2018")
Pair("month", "08")
Pair("day", "12")
)
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(i)
或者:
var i = intentFor(
Pair("year", "2018")
Pair("month", "08")
Pair("day", "12")
)
startActivity(i.newTask())
//newTask()等同于在AndroidManifest.xml文件中的standard
//singleTop()等同于singleTop
//clearTop()等同于singleTask
//noHistory()类似于standard,但栈中不会保存新启动的activity实例
//clearTask()等同于singleInstance
有时候我们需要在上一个界面接收下一个界面返回的数据,kotlin和java一样都会调用startActivityForResult方法来启动跳转:
OneActivity:
startActivityForResult(101, "year" to "2011", "month" to "09")
TwoActivity:
val intent = Intent()
intent.putString("end", "已接收")
setResult(Activity.RESULT_OK, intent)
第一个参数是requestCode,后面的参数是任意数量的需要被传递的数据键值对,TwoActivity中接收到数据后调用setResult方法将"已接收"返回给OneActivity。然后就是复写OneActivity中的onActivityResult方法来处理这个返回的数据:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
if (requestCode == 101 && data != null) {
tv_hello.text = data.extras.getString("end")
}
}
}