Kotlin【简介】Android开发 配置 扩展

重要资源

官方资源:官网 、 官网源码 、 官网文档  、   在线 IDE  、 GitHub
中文资源: 中文官网 、 中文文档 
离线文档: PDF 文件 、  PDF 文件 GitBook 版 、 ePUB 文件 、  Mobi 文件
中文 教程: Kotlin for android developers 、 Summary 、 整理 、 教程

Kotlin的背景

Kotlin 是 JetBrains在 2010年推出的 一种 基于 JVM 静态类型编程语言
JetBrains(位于东欧捷克)是 著名的JAVA开发IDE IntelliJ IDEA(Android Studio基于此开发) 软件的开发公司。
Kotlin 来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)。

用于现代多平台应用的 静态编程语言, 与 Java™ 和 Android™ 100% 可互操作
Kotlin 现在 是 Android 官方开发语言了!
构建用于以下平台的应用: JVM Android ,浏览器、原生 (就快好了)

为什么选择 Kotlin

简洁

大大减少样板代码的数量。
使用一行代码创建一个包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO:
data class Customer(val name: String, val email: String, val company: String)
1
1
 
1
data class Customer(val name: String, val email: String, val company: String)
或者使用 lambda 表达式来过滤列表:
val positiveNumbers = list.filter { it > 0 }
1
1
 
1
val positiveNumbers = list.filter { it > 0 }
想要单例?创建一个 object 就可以了:
object ThisIsASingleton {
    val companyName: String = "JetBrains"
}
3
3
 
1
object ThisIsASingleton {
2
    val companyName: String = "JetBrains"
3
}

安全

避免空指针异常、自动类型转换。
彻底告别那些烦人的 NullPointerException
var output: String
output = null   // 编译错误
2
2
 
1
var output: String
2
output = null   // 编译错误
Kotlin 可以保护你避免对可空类型的误操作
val name: String? = null    // 可空类型
println(name.length())      // 编译错误
 
1
val name: String? = null    // 可空类型
2
println(name.length())      // 编译错误
注意,String? 表示可以为 null 的 String 类型(可空类型)
并且如果你检查类型是正确的,编译器会为你做自动类型转换
fun calculateTotal(obj: Any) {
    if (obj is Invoice)
        obj.calculateTotal()
}
4
4
 
1
fun calculateTotal(obj: Any) {
2
    if (obj is Invoice)
3
        obj.calculateTotal()
4
}

互操作性

充分利用 JVM、Android 和浏览器的现有库。
使用 JVM 上的任何现有库,因为有 100% 的兼容性,包括 SAM 支持。
import io.reactivex.Flowable
import io.reactivex.schedulers.Schedulers
Flowable
    .fromCallable {
        Thread.sleep(1000) //  模仿高开销的计算
        "Done"
    }
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.single())
    .subscribe(::println, Throwable::printStackTrace)
10
10
 
1
import io.reactivex.Flowable
2
import io.reactivex.schedulers.Schedulers
3
Flowable
4
    .fromCallable {
5
        Thread.sleep(1000) //  模仿高开销的计算
6
        "Done"
7
    }
8
    .subscribeOn(Schedulers.io())
9
    .observeOn(Schedulers.single())
10
    .subscribe(::println, Throwable::printStackTrace)
无论是 JVM 还是 JavaScript 目标平台,都可用 Kotlin 写代码然后部署到你想要的地方
import kotlin.browser.window
fun onLoad() {
    window.document.body!!.innerHTML += "<br/>Hello, Kotlin!"
}
4
4
 
1
import kotlin.browser.window
2
fun onLoad() {
3
    window.document.body!!.innerHTML += "<br/>Hello, Kotlin!"
4
}

工具友好

可用任何 Java IDE 或者使用命令行构建。
一门语言需要工具化,而在 JetBrains,这正是我们做得最好的地方!

Kotlin Android开发

Intellij IDEA 是 JetBrains 提供的集成开发环境,可以用来开发 Kotlin 应用程序。
如果你是一名 Android 开发者,你也可以使用 Android Studio 来开发 Kotlin 程序。如你所知,Android Studio 其实就是 Intellij IDEA 的插件扩展,Intellij IDEA 是由 JetBrains 所开发,而 Kotlin 同样是由 JetBrains 创造的,其中的兼容性自然不用多说。

安装 Kotlin 插件

Android Studio 从 3.0 版本开始内置安装 Kotlin 插件。如果你正在使用的是早期版本, 需要通过 File | Settings | Plugins | Install JetBrains plugin… 搜索并安装 Kotlin 插件。 在 Android Studio 欢迎界面中,可以通过 Configure | Plugins | Install JetBrains plugin… 。 安装完成后需要重新启动 Android Studio。
Settings --> Plugin --> 点击Browse repositories --> 
搜索"Kotlin"(2017-5-3更新,696K下载,V1.1.2版本,57.2M)--> Install
2
 
1
Settings --> Plugin --> 点击Browse repositories --> 
2
搜索"Kotlin"(2017-5-3更新,696K下载,V1.1.2版本,57.2M)--> Install
由于插件过大,在AS可能很难下载成功,可以去 https://plugins.jetbrains.com/   搜索后下载, 也可以在AS中搜索到后,根据插件提示去指定位置下载。
Kotlin V1.1.2下载(适用于AS 2.3-3)  

创建新工程

使用 Kotlin 来进行 Android 的开发是极其之容易的。 在本章教程中,我们直接根据 Android Studio 的引导进行操作。若你当前使用的 IDE 是 Intellij IDEA,所有操作几乎一致。

首先,创建新的工程。选择 Start a new Android Studio project 或者 File | New project。根据弹出的对话框提示进行操作。 为新工程命名,选择已安装的 Android SDK 版本。实际上大多数选项均有默认值 ,只需要按几次“回车”键即可。

Android Studio 3.0 在创建新工程时的对话框中提供 启用 Kotlin 支持的选项,勾选后可以 跳过 “配置 Kotlin 工程(Configuring Kotlin in the project)”的步骤。

在 Android Studio 3.0 中,可以选择使用 Kotlin 创建 activity,因此也不需要“将Java 代码转换为 Kotlin( Converting Java code to Kotlin)”这一步骤。早期版本中则会先使用 Java 创建 activity,然后再使用自动转换工具 进行转换。

将 Java 代码转换为 Kotlin

一般而言,着手使用 Kotlin 的最便捷方式,无疑是将 Java 代码自动转换为 Kotlin。值得一提的是,与其为了使用新的方式表达旧的模式而去查阅文档, 不如 直接使用 Java 编写代码,再复制粘贴到 Kotlin 文件中,IntelliJ IDEA(或Android Studio)会提示需要转换代码。

打开 MainAc tivity.java 文件,使用 Convert Java File to Kotlin File 命令。使用 该命令的方式有如下几种, 强烈推荐 Find Action,输入相应的命令名称即可。同样也可以通过菜单栏依次调出 Code | Convert Java File to Kotlin File 或使用快捷键(Ctrl+Shift+Alt+K)完成操作。
注意:
此命令是把【.Java文件】转换为【.kt文件】,并把【Java格式的代码】转换为【Kotlin格式的代码】,而对于【.kt文件中的Java格式的代码】,通过此命令不会转换为Kotlin格式的代码
2
2
 
1
注意:
2
此命令是把【.Java文件】转换为【.kt文件】,并把【Java格式的代码】转换为【Kotlin格式的代码】,而对于【.kt文件中的Java格式的代码】,通过此命令不会转换为Kotlin格式的代码

kotlin-android 插件

在开始编辑此文件时,Android Studio 会提示当前工程还未配置 Kotlin,根据提示完成 操作即可;或者可以在菜单栏中选择 Tools | Kotlin |  Configure Kotlin …
选择配置时选择 all modules containing kotlin files 以及已安装的最新版本即可。

Kotlin 配置完成后,应用程序的 build.gradle 文件会更新。 你能看到新增了 apply plugin: 'kotlin-android' 及其依赖。
app目录下的build.gradle
apply plugin: 'kotlin-android'
...
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
3
3
 
1
apply plugin: 'kotlin-android'
2
...
3
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
根目录下的build.gradle
buildscript {
    ext.kotlin_version = '1.1.2-3'
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
6
6
 
1
buildscript {
2
    ext.kotlin_version = '1.1.2-3'
3
    dependencies {
4
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
5
    }
6
}

构建和发布Kotlin应用程序

最后 构建应用程序,在虚拟机或连接的设备上运行。 所有这些工作与 Java 并无区别。你可以发布应用程序,并以类似于使用 Java 编写的 Android 应用程序的方式进行 签名

Kotlin有着极小的运行时文件体积: 整个库的大小约 859KB(1.1.2-2 版本)。这意味着 Kotlin 对 apk 文件大小影响微乎其微

就对比 Kotlin 与 Jav a所编写的程序而言,Kotlin 编译器所生成的字节码看上去几乎毫无差异。

**Kotlin Android 扩展插件

本教程介绍如何使用 Kotlin Android  扩展插件提升安卓的开发体验。

背景

相信每一位安卓开发人员对 findViewById() 这个方法再熟悉不过了,毫无疑问,潜在的 bug 和脏乱的代码令后续开发无从下手的。 尽管存在一系列的开源库能够为这个问题带来解决方案,然而对于运行时依赖的库, 需要为每一个 View 注解变量字段现在 Kotlin 安卓扩展插件能够提供与这些开源库功能相同的体验,且 不需要添加任何额外代码,也不影响任何运行时体验

我们可以写出如下代码:
import kotlinx.android.synthetic.main.activity_main.*
class MyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.setText("Hello, world!")// 而不是 findView(R.id.textView) as TextView
    }
}
8
8
 
1
import kotlinx.android.synthetic.main.activity_main.*
2
class MyActivity : Activity() {
3
    override fun onCreate(savedInstanceState: Bundle?) {
4
        super.onCreate(savedInstanceState)
5
        setContentView(R.layout.activity_main)
6
        textView.setText("Hello, world!")// 而不是 findView(R.id.textView) as TextView
7
    }
8
}
textView 是对 Activity 的一项扩展属性,与在 activity_main.xml 中的声明具有同样类型。

kotlin-android-extensions 插件

Kotlin 安卓扩展插件是 Kotlin IDEA 插件的组成之一,因此不需要再单独额外 ,开发者仅需要在项目的 build.gradle 文件中 启用 即可:
apply plugin: 'kotlin-android-extensions'
1
1
 
1
apply plugin: 'kotlin-android-extensions'
仅需要一行 代码导入指定布局文件中所有控件属性:
import kotlinx.android.synthetic.main.<布局文件名称>.*
1
1
 
1
import kotlinx.android.synthetic.main.<布局文件名称>.*
若需要调用 View 的合成属性(在适配器类中非常有用),同时还应该导入
import kotlinx.android.synthetic.main.<布局文件名称>.view.*
1
1
 
1
import kotlinx.android.synthetic.main.<布局文件名称>.view.*
导入完成后即可调用在xml文件中以视图控件命名属性的对应扩展

多渠道

安卓扩展插件现已支持 安卓多渠道。假设当前在 build.gradle 文件中指定一个名为 free 的渠道:
android {
    productFlavors {
        free {
            versionName "1.0-free"
        }
    }
}
7
7
 
1
android {
2
    productFlavors {
3
        free {
4
            versionName "1.0-free"
5
        }
6
    }
7
}
所以现在只需要添加一行导入语句即可从 free/res/layout/activity_free.xml 布局中导入所有的合成属性:
import kotlinx.android.synthetic.free.activity_free.*
1
1
 
1
import kotlinx.android.synthetic.free.activity_free.*

背后原理

Kotlin 安卓扩展作为 Kotlin 编译器的插件,主要有两大作用:
在每一个 Kotlin Activity 中添加 一个隐藏缓存函数以及一个变量。该方法非常简洁,因此不会直接对APK体积有明显增加。
使用函数调用替换每一个合成属性。

其工作原理是,当调用合成属性,在模块资源中 Kotlin Activity/Fragment 类作为接收器时,缓存函数将被调用。 例如:
class MyActivity: Activity()
fun MyActivity.a() { 
        this.textView.setText(“”) 
}
4
 
1
class MyActivity: Activity()
2
fun MyActivity.a() { 
3
        this.textView.setText(“”) 
4
}
在 MyActivity 中生成一个隐藏缓存函数,因此我们可以使用缓存机制。
然而在下面的例子中:
fun Activity.b() { 
        this.textView.setText(“”)     
}
3
 
1
fun Activity.b() { 
2
        this.textView.setText(“”)     
3
}
我们并不知道这个函数会被我们自己的来源或者普通的 Java Activity 调用,因此, 即便在前一个示例中的 MyActivity 是接收器,也不会使用缓存。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值