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处理来自ActFirstActivityIntent后,结果回传

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()
    }
}