Kotlin学习指南—Activity跳转、Parcel、Intent、Launch Mode

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_TASKnewTask()
Intent.FLAG_ACTIVITY_SINGLE_TOPsingleTop()
Intent.FLAG_ACTIVITY_CLEAR_TOPclearTop()
Intent.FLAG_ACTIVITY_NO_HISTORYnoHistory()
Intent.FLAG_ACTIVITY_CLEAR_TASKclearTask()

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()
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin880828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值