Activity跳转
传递配对字段数据
val intent = Intent(this@MainActivity, Tinearlayoutactivity: :class.java)
startactivity(intent)
Kotlin代码与Java代码主要有两点不同之处:
(1)在类内部指代自身的this关键字,Java的完整写法是“类名.this”,而Kotlin的完整写法是“this@类名”,当然二者均可简写为“this”。
(2) 获取某个类的class 对象,Java的写法是“类名.class”,而Kotlin的写法是“类名::class.java”,一看便知带有浓浓的Java风味。
Anko库扩展函数的写法
startactivity<linearlayoutActivity>()
putExtra传数据
//第一种写法,参数名和参数值使用关键字to隔开
startActivity<ActsecondActivity>( request time" to DateutilnowTime, "request content" to et request.text.tostring())
注意到上面的写法使用关键字to隔开参数名和参数值,感觉不够美观,而且容易使人迷惑,to后面究竟要跟着字段名还是字段值呢? 所以Ako库提供了另一种符合习惯的写法,也就是利用Pair类把参数名和参数值进行配对,Pair的第一个参数为字段名,第二个参数为字段值。据此改写后的Kolin跳转代码如下所示:
//第二种写法,利用Pair把参数名和参数值进行配对
startnctivity<Actsecondactivity>(
Pair("request time", Dateutil .nowrime),
Pair("request content", et request .text.toString( )))
数据解析
无论哪种写法,在下一个活动中解析请求参数的方式都一样,都得先获取Bundle对象然后分别根据字段名称获取对应的字段值。解析请求参数的具体Kotlin代码如下所示:
//获得请求参数的包裹
val bundle = intent.extras
val request time = bundle.getstring( "request time")
val request content = bundlegetstring( "request content")
传递序列化数据
序列化对象
序列化对象的改造相当简单,仅需在类名之前增加一行注解“@Parcelize”就好了,于是整个类的Kotlin代码只有下面寥寥几行:
//@Parcelize注解表示自动实现Parcelable接口的相关方法
@Parcelize data class MessageInfoval (content: String, val send_time: String) : Parcelable
不过若想正常编译,还需修改模块的编译文件build.gradle,在文件未尾添加下面几行表示增加对安卓插件的编译支持:
//@Parcelize标记需要设置experimental = true
androidextensions {
experimental e true
}
传递序列化对象
编译文件修改完毕,现在能在Kotlin中使用序列化对象的注解了。虽然自定义的Messagelnfo类内部没有任何一行代码,但是它除了具备数据类的所有方法外,也自动实现了Parcelable接口的几个方法。接下来就可以利用该类传输活动跳转的序列化数据了,下面是改写后的
Kotlin跳转代码:
val request = MessageInfo(et request.text.toString(), Dateutil.nowTime) startActivity<ParcelableSecondActivity>( message" to request)
跳转后的下一个页面调用getParcelable即可正常获得原始的序列化数据,具体的数据解析Kotlin代码如下所示:
//获得Parcelable格式的请求参数
val request = intent.extras.getParcelable<MessageInfo>("message")
跳转时指定启动模式
前面提到Anko库的startActivity方法取消了Intent意图对象,这个做法有利有弊,弊端是Intent对象还有其他的设置方法,比如setAction方法用来设置动作、setData方法用来设置路径、addCategory方法用来设置动作类别、setType方法用来设置数据类型、setFlags方法用来设置启动模式等。所以对于复杂一点的活动跳转,必须要保留Intent对象,为此Anko库额外提供了intentFor方法,用于简单生成Intent对象,其书写格式类似于startActivity方法,
举人例子:
val intent = intentForActSecondactivity>( request time" to Dateutil.nowTime , "request content" to et_request.text.tostring())
然后设置intent
处理返回数据
页面跳转的多数情况是上一个页面传递请求参数给下一个页面,当然也有少数情况是上一个页面需要接收下一个页面的返回数据。此时 Kotlin 跟Java一样都采取startActivityForResult方法,表示这次活动跳转要求处理返回信息,具体的Kotlin代码举例如下:
val info = MessageInfo(et request.text.tostring(), ateutil.nowTime)
//ForResult表示需要返回参数
startActivityForResult<ActResponseActivity>(0,"message" to info)
那么下一个页面返回应答参数的Kotlin代码也跟Java的做法类似,一样要调用setResult方法将应答参数返回给上一个页面:
val intent = Intent()
intent.putExtra("message", responsel
//调用setResult方法表示携带应答参数返回到上一个页面setResult(Activity.RESULT OK, intent )
finish()
上一个页面接收到了返回的应答数据,将它解包获得原始的字段信息,再做进一步的处理。上一个页面处理返回数据的Kotlin代码也类似。
Service服务启停
普通方式启动服务
跟启动Activity的方式类似,也有Anko的扩展函数可用
//第一种写法,参数名和参数值使用关键字to隔开
intentNormal = intentFor<NormalService>("request content" to et_request.text .tostring())
//第二种写法,利用Pair把参数名和参数值进行配对
intentNormal = intentFor<NormalService>(Pair("request content", et request .text.tostring( )))
startservice(lintentNormal)
//虽然Anko库集成了startservice的简化写法,但是一般不这么调用//因为服务启动之后是需要停止的,按Anko的简化写法会无法停止服务//除非无须在代码中停止该服务,才可以采用Anko的简化写法
startServices<NormalService>("request content" to et request.text.tostring())
绑定方式启动服务
跟java没多大区别,可以使用intentFor方式创建Intent
广播收发Broadcast
广播没什么特别的