本期内容包括: ConstraintLayout的使用; Android Things的應用; 如何利用第三方庫使得Java具有Kotlin的一些新特性; Firebase是如何利用`ContentProvider`進行初始化的; Kotlin上的并發處理; 其他還有一些關于程式架構, 代碼優化相關的讨論.
December 25th, 2016
Android Weekly Issue #237
這是本年的最後一篇issue, 感謝大家.
本期内容包括: ConstraintLayout的使用; Android Things的應用; 如何利用第三方庫使得Java具有Kotlin的一些新特性; Firebase是如何利用<code>ContentProvider</code>進行初始化的; Kotlin上的并發處理; 其他還有一些關于程式架構, 代碼優化相關的讨論.
本文介紹<code>ConstraintLayout</code>的chains和ratios. 另外還提到很多使用<code>ConstraintLayout</code>的實作細節.
所謂chains就是幾個View之間建立的雙向限制.
ratios是幫助你設定View的寬高比, 它所做的事情和PercentFrameLayout差不多, 但是不用添加額外的ViewGroup.
用ObjectAnimator和Android Things搭建的一個電子蠟燭.
ExoPlayer 2.1有什麼新功能.
這是他們的release notes.
如果你因為種種原因不能在項目中使用kotlin, 這篇文章告訴你如何借助于一些工具和庫用Java實作Kotlin的一些features.
作者釋出了一個改變聲音的應用, 并且将其開源了: ChristmasVoice.
Firebase在Android上是如何初始化的?
很多SDK在初始化的時候會要求應用傳入<code>Context</code>. Firebase簡化了這一步驟. 解決方案就是用了<code>ContentProvider</code>, 既解決了時間問題, 也得到了sdk需要的<code>Context</code>. 并且不需要應用的開發者添加任何額外的初始化代碼.
選擇<code>ContentProvider</code>主要有兩點原因:
<code>ContentProvider</code>初始化早.
當一個Android程序啟動的時候, 首先會初始化每一個ContentProvider, 然後是Application, 最後是被Intent啟動的元件.
在ContentProvider初始化的時候, 就可以拿到Context了.
<code>ContentProvider</code>可以merge到最終的manifest裡.
Manifest merge是在build的時候來定義你的應用最終的manifest. 最終的manifest會包含所有依賴的庫的manifest中聲明的元件.
如果你也想選擇用<code>ContentProvider</code>來做應用或庫的初始化, 請注意authority的唯一性問題和<code>ContentProvider</code>隻在主程序運作的問題.
當我們在改善代碼可讀性的時候, 很有可能會影響到性能和可維護性.
作者舉例說明了他在實際程式設計中遇到的幾個問題.
如何開發Android Things應用, 才能讓測試更加容易. 本文以一個很小的LED燈閃爍程式為例.
Uber團隊重新打造了他們的ride app, 提出了一個新的構架模式: Riblets.
關于架構的選型, 已有的類型可以檢視這個iOS Architecture Patterns.
作者重構了自己應用的代碼, 應用了clean architecture, 本文講述了其過程.
Papercut是一個庫, 用來标記那些我們覺得需要删除或者需要重構的代碼.
作者最近看了一本書, 講Android的并發, 覺得很好, 想要用Kotlin來重寫書中的例子, 結果發現:
Kotlin中沒有<code>synchronized</code>關鍵字.
Kotlin中沒有<code>volatile</code>關鍵字.
Kotlin中的<code>Any</code>, 類比于Java中的<code>Object</code>, 但是卻沒有<code>wait()</code>, <code>notify()</code>和<code>notifyAll()</code>方法.
是以Kotlin中的并發是怎麼處理呢? 這裡有個問題: Kotlin forum, Kotlin語言的開發人員表示這些應該由庫來處理, 而不是語言本身.
盡管Kotlin不支援, 但是它還是提供了一些底層的并發工具.
建立線程. 因為Kotlin可以調用Java代碼, 是以仍然可以通過兩種方法來建立線程.
<code>@Synchronized</code>注解和<code>synchronized()</code>方法.
<code>@Volatile</code>注解.
沒有<code>wait()</code>, <code>notify()</code>和<code>notifyAll()</code>方法, 但是可以把<code>Object</code>對象作為鎖, 然後調用鎖的這些方法.
stackoverflow上有一個相關問題, 答案很不錯, 列了處理并發的一些有用的庫.
一個Screen Kata應用, 用來練習做UI測試的.
一個用來标記需要重構或者移除代碼的工具庫.
一個可以自定義的對角線切割View.
一個動态的主題庫, 讓你可以友善地修改應用的顔色.
包裝了JCA API和AndroidKeyStore API, 讓建立, 加密和管理任何Android API的keys變得更容易.
作者: 聖騎士Wind
出處: 部落格園: 聖騎士Wind
Github: https://github.com/mengdd
微信公衆号: 聖騎士Wind
