zoukankan      html  css  js  c++  java
  • 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加载的功能.
    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.

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/mengdd/p/5804046.html
Copyright © 2011-2022 走看看