1. Activity跳转
1.1 不带参数
import org.jetbrains.anko.startActivity
......
startActivity<ActSecondActivity>()
......
1.2 带参数
val request = MessageInfo("this is message", "12121313")
startActivity<ActSecondActivity>("message" to request) //参数key-value通过to连接
//对象作为参数传递时需要序列化,所以MessageInfo需要实现Parcelable接口
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
//kotlin实现Parcel序列化的注解
@Parcelize
data class MessageInfo (val content: String, val send_time: String) : Parcelable {
}
1.3 启动模式
启动模式通常在AndroidManifest.xml文件中声明,如果有必要在代码中设置需要调用intent相关方法,通常使用addFlags或者setFlags方法, Kotlin对这些Flag设置做了简化
val intent = intentFor<ActSecondActivity>(
"request_time" to "12121313",
"request_content" to "requst content")
startActivity(intent.newTask())
launchMode属性说明
launchMode属性 | 说明 |
standard | 标准模式,无论何时启动哪个activity,都重新创建该页面实例并放入栈尾,默认为该模式 |
singleTop | 启动activity时,判断栈顶正好是该activity的实例,就重用该实例; 否则创建新实例放入栈顶,否则情况与standard类似 |
singleTask | 启动activity时,判断栈中存在该Activity实例,就重用该实例,并清除位于该实例上面的所有实例,否则情况处理同standard |
singleInstance | 启动activity时,将该activity实例放入一个新栈中,原栈实例列表保持不变 |
Intent启动标志取值说明
Intent类启动标志 | 说明 |
Intent.FLAG_ACTIVITY_NEW_TASK | 开启一个新任务,flags默认该值,该值类似于launchMode=“standard”, 不同之处在于,如果原来不存在活动栈,FLAG_ACTIVITY_NEW_TASK就会创建一个新栈 |
Intent.FLAG_ACTIVITY_SINGLE_TOP | 当栈顶为跳转的activity实例时,重用栈顶的实例。该值等同于launchMode=“singleTop” |
Intent.FLAG_ACTIVITY_CLEAR_TOP | 当栈中存在待跳转的activity实例时,重新创建一个新实例,并将原实例上方的所有实例加以清除。该值与launchMode="singleTask"类似,但是singleTask采用onIntent启动原任务,而FLAG_ACTIVITY_CLEAR_TOP采用先onDestory再onCreate创建新任务 |
Intent.FLAG_ACTIVITY_NO_HISTORY | 该标志与launchMode="standard"情况类似,但栈中不保存新启动的activity实例。这样下次无论何种方式再启动该实例,也要走standard完整流程 |
Intent.FLAG_ACTIVITY_CLEAR_TASK | 该标志非常暴力,跳转新页面时,栈中原有实例被清空,注意,该标志需要结合FLAG_ACTIVITY_NEW_TASK使用,即setFlags的参数为“Intent.FLAG_ACTIVITY_CLEAR_TASK\Intent.FLAG_ACTIVITY_NEW_TASK” |
启动标志的Anko方法与Java对应关系
Intent启动标志 | Anko库标志设置函数 |
Intent.FLAG_ACTIVITY_NEW_TASK | newTask() |
Intent.FLAG_ACTIVITY_SINGLE_TOP | singleTop() |
Intent.FLAG_ACTIVITY_CLEAR_TOP | clearTop() |
Intent.FLAG_ACTIVITY_NO_HISTORY | noHistory() |
Intent.FLAG_ACTIVITY_CLEAR_TASK | clearTask() |
1.4 startActivityForResult
class ActFirstActivity:AppCompatActivity() {
//启动ActSecondActivity页面
fun startActForResult(){
val info = MessageInfo("request content", "1212121313")
//ForResult表示需要返回参数
startActivityForResult<ActSecondActivity>(0, "message" to info)
}
//处理ActSecondActivity页面结果回传
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (data != null) {
//获取上一个页面的应答参数
val response = data.extras.getParcelable<MessageInfo>("message")
val responseText = "content = ${response?.content}, time = ${response?.send_time}"
}
}
}
页面ActSecondActivity
处理来自ActFirstActivity
的Intent
后,结果回传
class ActSecondActivity:AppCompatActivity() {
fun setResult(){
val response = MessageInfo("response content", "1212121313")
val intent = Intent()
intent.putExtra("message", response)
//调用setResult表示携带应答参数返回到上一个页面
setResult(Activity.RESULT_OK, intent)
finish()
}
}