Kotlin学习笔记——Activity活动跳转
传送配对字段数据
打开一个新页面
1 | startActivity<secondActivity>() |
注意
- 这个函数需要anko库的支持
打开页面并向新页面传递参数
使用关键字to
1 | startActivity<secondActivity>( |
使用Pair类
1 | startActivity<secondActivity> ( |
在新页面中获取参数
1 | val bundle = intent.extras |
补充
1. intent
Intent的概念:
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。我们来看下面这个图就知道了:
如果Activity1需要和Activity2进行联系,二者不需要直接联系,而是通过Intent作为桥梁。通俗来讲,Intnet类似于中介、媒婆的角色。
2. bundle
Android中Bundle类的作用
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值
根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html)
Bundle类是一个key-value对,“A mapping from String values to various Parcelable types.”
传送序列化数据
1 |
|
注意
- 注解
@Parcelize
不是没有用的,它可以告诉编译器,让编译器自动实现writeToParcel
、createFromParcel
、newArray
、describeContents
四个方法 - 要在
build.gradle
的文件末尾添加如下几行
1 | androidExtensions { |
这样以后,就可以在页面之间传递活动跳转的序列化数据了
1 | val request = MessageInfo("你好你好!", currentTime.toString()) |
在跳转后的页面获取数据
1 | val request = intent.extras.getParcelabel<MessageInfo>("message)//获得数据 |
跳转时指定启动模式
启动标志 | 对应anko库函数 | 说明 | 备注 |
---|---|---|---|
Intent.FLAG_ACTIVITY_NEW_TAST | intent.newTask() | 开启一个新任务。这个值类似于launchMode=“standard”,不同之处在于,如果原来不存在活动栈,这个标志就会创建一个新栈 | |
Intent.FLAG_ACTIVITY_SINGLE_TOP | intent.singleTop() | 当栈顶为待跳转的activity实例时,重用栈顶的实例,该值等同于launchMode=“singleTop” | |
Intent.FLAG_ACTIVITY_CLEAR_TOP | intent.clrarTop() | 当栈中存在待跳转的activity实例时,重新创建一个新实例,并将原实例上方所有实例清除。该值与launchMode="singleTask"相似,但是launchMode="singleTask"采用onNewInten启用原任务,而这个标志先onDestroy再onCreate创建新任务 | |
Intent.FLAG_ACTIVITY_NO_HISTORY | intent.noHistory() | 这个标志与launchMode="standard"相似,但栈中不保存新启动的activity实例。下次无论使用哪种方法再启动该实例,都要走完standard的完整流程 | |
Intent.FLAG_ACTIVITY_CLEAR_TAST | intent.clearTask() | 这个标志非常暴力,跳转到新页面时,栈中原有实例都被清空。这个flag要结合newTask使用 |
处理返回数据
当从一个页面跳转回原来的页面时,有可能要向上一个activity返回一些数据
- 第一个页面打开第二个页面时,改用startActivityForResult
1 | val info = MessageInfo("去吧!去吧!", currentTime.toString()) |
- 第二个页面退出时,添加传送数据
1 | val info = MessageInfo("回来了!回来了!", currentTime.toString())//返回给第一个页面的数据 |
- 上一个页面接受返回值
1 | override fun onActivityResult(RequestCode:Int, resultCode:Int, data:Intent?) { |
onRestart()函数
参考:
两分钟彻底让你明白Android Activity生命周期(图文)!
https://blog.csdn.net/liuhe688/article/details/6733407
调用时机
- 按下home键之后,然后切换回来,会调用onRestart()。
- 从本Activity跳转到另一个Activity之后,按back键返回原来Activity,会调用onRestart();
- 从本Activity切换到其他的应用,然后再从其他应用切换回来,会调用onRestart();
应用场景
在登录页面上,用户忘记密码,点击"忘记密码"并跳转到相应页面,当返回登录页面时,最好自动清空原来的密码,如果这个操作写在onActivityResult上,那么当用户打开"找回密码"页面,不属于调用onActivityResult的时机
实例
1 | override fun onRestart() { |
Kotlin学习笔记——Activity活动跳转
https://jingtianer.github.io/home/2019/04/12/Kotlin-Android学习笔记/Kotlin学习笔记——Activity活动跳转/