进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限:

    <!-- 震动 --><uses-permission android:name="android.permission.VIBRATE" />

让手机震动的功能用到了震动器Vibrator类,而震动器对象从系统服务VIBRATOR_SERVICE获得,实现该功能的代码很简单,即便用Java书写也只有以下两行代码:

    Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);vibrator.vibrate(3000);

两行代码看起来真没什么好简化的了,因为转换成Kotlin也要下面的两行代码:

    //常规做法:从系统服务中获取震动器对象val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibratorvibrator.vibrate(3000)

虽然获取震动器的代码并不多,但是这真的真的很难记忆,首先开发者要调用getSystemService一把,接着绞尽脑汁才能想起该服务的名称是VIBRATOR_SERVICE,最后再强制将类型转换为Vibrator。其中又是大写子母又是小写字母还有大小写混合,对于英文不溜的朋友来说,这简直是个灾难。如果只要一个琅琅上口的单词就能代表震动器,那势必为开发者省去了背诵专业英语单词的麻烦。然而两行代码还能怎么优化?倘若改造成工具类获取震动器对象,也不见得一定省事。
不过Kotlin可不会善罢甘休,相反是迎难而上,因为它坐拥扩展函数这个法宝,之前我们多次见识了扩展函数的威力,比如提示窗的toast、提醒对话框的alert等等。当然获取震动器对象也能按照扩展函数来改造,比如给Context添加一个扩展函数getVibrator,则该扩展函数的Kotlin代码示例如下:

//获取震动器
fun Context.getVibrator() : Vibrator {return getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
}

接着回到Activity页面代码,实现震动功能只需下面的一行代码了:

    //利用扩展函数获得震动器对象getVibrator().vibrate(3000)

以上代码固然简化了,却仍然不是最简单的写法,看看getVibrator()方法,前面有get后面有括号,都是碍手碍脚的家伙。可去掉括号就不是函数了,而变成了属性,难不成Kotlin啥时多了个扩展属性的用法?其实Kotlin还真的可以实现扩展属性的功能,关键是要利用扩展函数进行移花接木,只要在kt文件中声明一个Context类的新属性,同时定义该属性的get方法(get方法为扩展函数)。如此一来,外部访问该扩展属性之时,编译器会自动调用该属性的get方法,从而通过扩展函数间接实现了扩展属性。接下来依旧以震动器为例,看看如何使用Kotlin代码声明扩展属性vibrator:

//获取震动器
//利用扩展函数实现扩展属性,在Activity代码中即可直接使用vibrator
val Context.vibrator : Vibratorget() = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

现在回到Activity代码,如下所示只要通过vibrator就能访问震动器的方法了:

    //利用扩展函数实现扩展属性,直接使用vibrator即可指代震动器对象vibrator.vibrate(3000)

当然要想正常访问自定义的扩展函数和扩展属性,需要在活动代码头部加上以下的导入语句:

import com.example.custom.util.vibrator

除了震动器之外,其它从系统服务获得对象的管理器也能照此办理,譬如通知管理器NotificationManager,按照之前的调用方式是下面的Kotlin代码:

    val notifyMgr = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotifyMgr.notify(R.string.app_name, notify)

显然通知管理器对象的获取代码更冗长,接下来将其改造为扩展属性的方式,则相应的Context扩展代码如下所示:

//获取通知管理器
//试试在Activity代码中调用“notifier.notify(R.string.app_name, notify)”
val Context.notifier: NotificationManagerget() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

然后原来通知管理器的两行代码便缩减为下面的一行代码了:

    notifier.notify(R.string.app_name, notify)

举一反三,剩下的来自系统服务的管理器统统运用扩展属性,能够更好地方便将来的开发工作。下面是几个常用管理器的扩展属性实现代码例子:

//获取下载管理器
val Context.downloader: DownloadManagerget() = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
//获取定位管理器
val Context.locator: LocationManagerget() = getSystemService(Context.LOCATION_SERVICE) as LocationManager
//获取连接管理器
val Context.connector: ConnectivityManagerget() = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//获取电话管理器
val Context.telephone: TelephonyManagerget() = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
//获取无线管理器
val Context.wifi: WifiManagerget() = getSystemService(Context.WIFI_SERVICE) as WifiManager
//获取闹钟管理器
val Context.alarm: AlarmManagerget() = getSystemService(Context.ALARM_SERVICE) as AlarmManager
//获取音频管理器
val Context.audio: AudioManagerget() = getSystemService(Context.AUDIO_SERVICE) as AudioManager

点此查看Kotlin入门教程的完整目录

__________________________________________________________________________
打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ok9370ssa3ep

Kotlin入门(33)运用扩展属性相关推荐

  1. Kotlin入门教程——目录索引

    Kotlin是谷歌官方认可的Android开发语言,即将发布的Android Studio 3.0版本也会开始内置Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初And ...

  2. Kotlin学习笔记(五) 扩展函数 扩展属性

    2019独角兽企业重金招聘Python工程师标准>>> 扩展函数和属性可以定义在对应的类中和kotlin文件中; 1.扩展函数 1.扩展函数可以由对象直接调用,在扩展函数中,用thi ...

  3. kotlin - 扩展方法和扩展属性

    kotlin - 扩展方法和扩展属性 我们都知道java要扩展一个已有类的方法和属性必须采用继承.组合或直接修改现有类来进行功能和属性的扩展.而kotlin是完全支持扩展方法和扩展属性的,这样我们就可 ...

  4. 【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )

    文章目录 I . 扩展属性 总结 II . 扩展属性 定义格式 III . 扩展属性 标准示例 IV . 扩展属性 注意事项 V . 扩展属性 本质分析 VI . 扩展属性 代码示例解析 I . 扩展 ...

  5. Kotlin入门(23)适配器的进阶表达

    前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象.随着 ...

  6. Kotlin入门(19)Android的基础布局

    线性布局 线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维 ...

  7. Kotlin入门(18)利用单例对象获取时间

    前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...

  8. Kotlin入门(11)江湖绝技之特殊函数

    上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数.内联函数.扩展函数.尾递归函数.高阶函数等等,因此本篇文章就 ...

  9. Kotlin入门(2)让App开发变得更容易

    上一篇文章介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android Studio上使用Java进行编码,本来就是理所应当的,何必还要专门弄个Kot ...

最新文章

  1. python程序如何执行死刑图片_如何判断对象已死
  2. 表格对决CSS--一场生死之战
  3. 【十三单元】 软件安装 yum源配置
  4. android 小黄车首页,android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码...
  5. 简单三分钟,本地搭建k8s
  6. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
  7. [转]如何在.NET MVC中使用jQuery并返回JSON数据
  8. 记录远程桌面登录者的IP和MAC
  9. asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法
  10. 计算机密码发明者去世!曾获图灵奖、并启蒙 Unix 诞生!
  11. [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
  12. c语言数组字节偏移,C语言数组中的地址偏移问题
  13. jquery.validation.js 表单验证
  14. 读取 RV1126 CPU温度 NPU CPU频率
  15. cesium获取坐标及高程
  16. 【例题】【高斯消元】USACO3.2.4 Feed Ratios
  17. android 第三方SDK接入一般流程
  18. 对抗网络之PG-GAN,无条件下生成更真实的人脸图像
  19. 【程序设计】浅拷贝与深拷贝
  20. 高通终端修改nv值后,不重启终端即生效

热门文章

  1. 吴恩达机器学习总结一:初识机器学习
  2. python中的随机函数的用法_python中的随机函数小结
  3. 保密作战--在网络上隐藏自己
  4. matlab求灰度图像梯度,[求助]如何求图像的梯度
  5. 雅可比迭代c++实现_线性方程组(3)-静态迭代法
  6. 并发执行linux命令结果混乱,Shell脚本--并发执行
  7. linux系统找运行指令,Linux系统常用指令总结
  8. 单点服务器微信公众号,腾讯云联合微信降低开发门槛 微信生态从单点云开发到全面云开发...
  9. 微型计算机主机箱内的所有部件均由,计算机应用基础模拟题
  10. goquery php,golang:Goquery简单爬虫实例