Android Weekly Notes Issue #219

Android Weekly Issue #219

August 21st, 2016
Android Weekly Issue #219

ARTICLES & TUTORIALS

Android: Bottom Sheet

Bottom Sheet是一个从底部滑上来的组件, 关于这个Google Material Design有相关的guidelines.
这篇文章主要讲了基本使用, 比较简单.

这里私心推荐一下我自己的repo和另一个我觉得很好的教程:
AndroidDesignWidgetsSample
CodePath-handling-scrolls-with-CoordinatorLayout

DI 101 - Part 1

Android平台的依赖注入.
文章开始讲了下依赖注入的概念, 当前在Android上的依赖注入最著名的是Dagger2.
然后文章讲了如何set up dagger 2, 举了个例子, 写Module, Component, 然后使用.

这里再私心推荐一下我自己的一篇教程:
Using Dagger2 in Android

Android Security: Welcome to Shell (Permissions)

作者在Reddit上看到了这么一句话:
ADB is a shell that you get on a PC with the same permissions as if you were to run a shell/terminal app on the phone itself.
于是就写了这篇文章来讨论一下shell命令的权限问题, 关于系统底层的权限如何工作.
作者在里面提到了这本书Android Security Internals: An In-Depth Guide to Android's Security Architecture.
关于Android安全方面的研究, 作者还建了一个repo: Android-Security-Reference, 里面是关于安全问题的各种notes, still WIP.

Lessons from converting an app to 100% Kotlin

这是关于Kotlin的系列文章之part 1, part 2的文章在这里Kotlin: The Good, The Bad, and The Ugly, 讨论Kotlin的语言设计.
本篇文章讲什么呢?
作者是一个应用的leader engineer, 学习了几天Kotlin之后, 觉得可以解决Java存在的一些痛点, 于是把应用改为用Kotlin了, 这篇文章是在此过程中的一些想法.

方法数问题: 因为dex对方法数有要求, 不能超过64k, 见这里:multidex, 作者用了这个工具来统计方法数dexcount-gradle-plugin. 最后证明迁移到Kotlin之后, 代码行数减少了30%, 方法数减少了10%.

Retrolambda: 本来Retrolamda会生成匿名类, 并加上一些方法. Kotlin有内置的方法(apply), lamda可以直接传入, 不用生成匿名类, 不用添加额外的方法.

Guava: Guava的功能已经被Kotlin的标准库覆盖, 作者举例了Guava中的ComparisonChains, Optional, lazy fields和Preconditions等, 均有对应的Kotlin方法.

ButterKnife: ButterKnife仍然可以使用, 但是Kotlin Android Extensions提供了更加自然的方式来访问绑定的views. 还有其他的方案比如KotterknifeAnko, 但是这俩都各自有些缺点, 不如Kotlin Android Extensions好用.

RxJava: RxJava仍然是很好的, 但是由于对集合并没有函数式的方法, 所以有时候会用Kotlin替代一下.

Kotlin的一个优势就是它和Java可以互相调用, 所以可以逐步改动.
Intellij有自动把Java转化为Kotlin的功能, 但是有时候会有错.

作者推荐了学习Kotlin的资源:Reference.
最后鼓励大家使用Kotlin, 因为它现在已经足够成熟了.

Rewriting Android Priority JobQueue - Lessons Learned

作者有一个repo: android-priority-jobqueue, 是为Android写的任务队列管理framework, 用于调度管理后台任务.
后来Android自己也加了这个类JobScheduler.
最近作者重写了这个库, 改善了稳定性并加了new features, 发了V2版, 然后写个文章分享一下心得:

  • 不要通过share memory来通信, 应该通过通信来share memory.
    以前是多个线程访问加锁的共享资源, 线程里的一些字段标记为volatile. 新版JobManager改为单线程, 只有它可以访问共享资源, 其他线程都和JobManager通信. 这里有个文章在说这种方法Share Memory By Communicating
  • 如果你的代码需要做时钟相关的事情, 抽象出来.
    这主要是为测试和CI考虑.
  • 加新API之前多想想.

Trello Android Schema Upgrades

Trello Android之前的数据库升级方式相当简单粗暴, 他们drop整个数据库, 重新创建, 然后用server上的数据填进来.
这样在以前是没有问题的, 因为Trello的每一个操作都会立即发送给server, 不支持离线操作, 所以server上的数据永远是最新的.
但是最近他们想支持离线工作了, 这就说明不能简单地删数据库了, 因为其中可能含有没有发给服务器的离线数据.
他们要升级数据库, 这篇文章讲了他们的升级策略和他们为数据库升级而写的测试.

Animating the text <-> dots translation on password field

这个链接点进去是Twitter.
在新的support库升级(August 2016, v24.2.0)Support Library Revision History中, TextInputLayout增加了密码可见的toggle. Nick Butcher决定给按钮和文字的改变都加上动画.
这是他的repo: plaid.

Introducing Android code style guidelines at Buffer

团队工作中, 有统一的代码风格很重要, 代码风格主要是代码的可读性和一致性相关问题.
作者他们为自己的Android App归档了新的code style: project style guidelines, 当然啦, 文档是在使用中不断成长的.
做这种事主要目标是以下几个点: 一致性, 可读性, 可维护性, 易于浏览查询, 有意义.
文档写得很详细, 涉及到各个方面, 值得一看.

Building UserScope with Dagger 2

关于Dagger 2里面自定义scope, 作者之前有一篇文章Dependency injection with Dagger 2 - Custom scopes, 本篇文章继续了这个话题.
所谓scope呢, 就是限制了单例的生存周期, 有些单例可能在整个应用生命周期都存在, 另一些单例可能只需要存在一定的时间. Dagger 2默认只提供了一个scope @Singleton, 所以我们要根据需要自定义自己的scope.
作者的例子中定义了@UserScope, 以实例说明了他的实现, 还讨论了UserScope的状态恢复问题.
例子代码: Dagger2Recipes-UserScope

Using Java 8 Lambda expressions in Android

Java 8的一个重要特性是加入了Lambda表达式.

Lambda表达式的语法:

  • 括号里是用逗号分隔的参数列表, 类型可以省略, 如果只有一个参数, 连括号也可以省略.
    举例:
TextView textView = (TextView) findViewById(R.id.text_view);
textView.setOnLongClickListener(v -> System.out.println("Long Click"));
  • 箭头符号 ->
  • 箭头后面的body是单个表达式或者一个语句块.
    如果是单个表达式, java runtime会返回它的值;
    如果是语句块, 用大括号{}包起来.

在Android中使用Lambda表达式:
需要改build.gradle:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

还有另一种方式是使用RetroLambda plugin: gradle-retrolambda

Developing for Android Wear - A Noob’s perspective

这篇文章讲了作者作为一个新手, 第一次开发Wear应用的时候遇到的种种问题.
比如, 手表和手机是需要配对的, 在手机上安装Google的这个软件, 才能和手表配对, 配对了之后, 给手机安装release版apk的时候就会自动给手表安装应用.
也可以在Android Studio中选择wear来单跑Wear应用安装到手表, 但是只有配对了才能和手机有通信.
使用Wear的模拟器, 还需要运行这个命令adb -d forward tcp:5601 tcp:5601来和连接到电脑的手机连接.
还有在传输Assets时, 作者按照官方文档的例子, 却遇到了一些方法不能在UI线程调用的问题, 后来也解决了.

Remote config with Firebase

作者讲了如何实现Firebase的Remote config.
Remote config可以使我们控制应用的更新, 而不用重新发布一个版本.
为什么要使用远程配置呢? 主要的原因是测试新的功能, 然后可以根据用户的反馈快速地做出响应, 把更好的行为呈现给用户. 简单来说就是做A/B Test.
Firebase的remote config很强大, 指定参数后可以指定应用条件, 包括国家, 系统, 应用版本, 随机等等.

DESIGN

Updates in Material design guidelines

2016年8月新发布的Material design包括了以下更新:
Notifications, Widgets, 确认操作和操作后的提示.
比较重要的更新是:
Navigation现在包括了如何使用Up和Back button.
还有使用全屏模式的三种模式:Lean back, Immersive, Lights Out以及它们相应的交互行为.

LIBRARIES & CODE

Auto-value-firebase

AutoValue的扩展, 用来创建Firebase的数据库对象.
AutoValue是google的一个库. 用来创建interchangeable的对象, 即如果两个对象的所有fields是相等的, 我们认为这两个对象相等.

Icicle

基于注解的一个工具, 用来保存和恢复实例的状态.
感觉跟Icepick一样.

ReadMoreTextView

一个自定义的TextView, 可以指定按照文字长度或者行数截取显示, 带展开和关闭按钮操作.

Android-priority-jobqueue

一个为Android写的后台任务队列管理程序.

NEWS

Support Library Revision History

Android Support Library 24.2.0发布啦(August 2016).

v4被分成了很多小模块.

API更新:
Custom Tabs可以控制instant app是否打开.
TextInputLayout加了密码可见的toggle.
Transition兼容到API 14及其以上.
Custom Tabs support library支持给secondary toolbar用RemoteViews.
AppCompatResources加了可以通过getDrawable()方法, 以resource id加载<vector>和<animated-vector>的功能.
CoordinatorLayout现在支持定义inset views, 然后指定其他Views给其让路. 就是当Snackbar出现的时候, FloatingActionButton躲开的那种行为, 只不过现在给任意的child view都可以设置了.
DiffUtil类可以计算出两个集合的不同, 然后得出一个更新操作的list, 可以交给RecyclerView.Adapter.
新增了RecyclerView.OnFlingListener. 有SnapHelper和LinearSnapHelper可供选择使用.

行为改变:
day/night模式改变的时候, activity将会自动重启.
如果status bar是透明的, Snacker现在会在navigation bar后面绘制.

其他还有一些deprecations和bug fixes.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,321评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,387评论 2 44
  • 昨晚,已经预约近半年的“五魁首”终于聚在了一起,时隔八年,期间也只是隔着屏幕或偶遇过一两次,也都是匆匆别过。相聚不...
    jm敏姐阅读 230评论 2 2
  • 有些人存在于你的朋友圈,让人有种一颗老鼠屎掉进一锅汤的感觉,但这颗老鼠屎你还不能剔除,就好比有对就有错、有好就有坏...
    流转zl阅读 265评论 0 0