Android Weekly Notes Issue #219

Android Weekly Issue #219

August 21st, 2016
Android Weekly Issue #219html

ARTICLES & TUTORIALS

Android: Bottom Sheet

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

这里私心推荐一下我本身的repo和另外一个我以为很好的教程:
AndroidDesignWidgetsSample
CodePath-handling-scrolls-with-CoordinatorLayoutandroid

DI 101 - Part 1

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

这里再私心推荐一下我本身的一篇教程:
Using Dagger2 in Androidgithub

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.golang

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了, 这篇文章是在此过程当中的一些想法.shell

方法数问题: 由于dex对方法数有要求, 不能超过64k, 见这里:multidex, 做者用了这个工具来统计方法数dexcount-gradle-plugin. 最后证实迁移到Kotlin以后, 代码行数减小了30%, 方法数减小了10%.数据库

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

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加载 的功能.
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.

相关文章
相关标签/搜索