Android Weekly Notes Issue #225

来源:http://www.cnblogs.com/mengdd/archive/2016/10/09/5941710.html
-Advertisement-
Play Games

Android Weekly中文筆記, Issue #225. 本期內容包括: Android 7.0的Quick Settings; Firebase; 相容舊版本的shared element transition; Wear; ORM: 用ActiveAndroid做資料庫存儲; 崩潰報告工具... ...


Android Weekly Issue #225

October 2nd, 2016
Android Weekly Issue #225

本期內容包括: Android 7.0的Quick Settings; Firebase; 相容舊版本的shared element transition; Wear; ORM: 用ActiveAndroid做資料庫存儲; 崩潰報告工具對比; Google Cast API介紹; Google的播放器庫ExoPlayer 2.x發佈; 項目的包結構整理; Task API的使用等等.

ARTICLES & TUTORIALS

Android 7.0的快速設置 Quick Settings Tiles

從Android 7.0 (API 24)開始, 任何app都可以創建一個quick settings tile, 快速訪問關鍵功能.
它除了是一個展示最新信息的UI, 點擊一個片還可以trigger後臺任務, 打開dialog或activity.

一個好的quick settings tile:
決定是否要建立這樣一個tile時, 主要考慮緊急性和頻繁性兩個方面.

每一個tile和一個TileService關聯. 和其他service一樣, 它需要在manifest中註冊, 它的label和icon就是顯示在quick settings上的文字和圖片.

TileService的生命周期:
TileService是一個bound service, 它的生命周期主要由系統控制. 主要有三個階段: being added, listening, being removed.

  • onTileAdded(): 當用戶添加這個tile到quick settings.
  • onStartListening(): tile變為可見.
  • onStopListening(): tile變為不可見.
  • onTileRemoved(): 用戶移除這個tile.

以上這是預設模式, 如果你準確地知道何時更新, 你可以使用active mode.
此時更新的回調onStartListening()是通過靜態方法主動觸發的.

更新UI:
UI是Tile, 主要包含icon, label, description和state. 最後必須調用updateTile()方法.

處理點擊:
onClick()回調觸發的時候, 我們可以啟動一些後臺工作, 或者showDialog(), 或者startActivityAndCollapse().

對於鎖屏的機器有一些限制, 不能打開dialog, 並且activity需要有一個特定的flag, 有一個unlockAndRun()方法可以讓用戶先解鎖後做一些工作.

長按tile預設會打開app的app info屏, 當然這個行為也可以override. 只要給你想打開的activity加上ACTION_QS_TILE_PREFERENCES.

Android開發最佳實踐 Android Development Best Practices

關於性能:
Best Practices for Performance;
Performance and Optimization

關於架構:
android-architecture

寫單元測試和UI測試.

使用Proguard, Stetho.
復用佈局, 使用標簽.
reusing-layouts.

把launcher icons放在mipmap文件夾下.

多用shape和selector而不是圖片.

避免深層次的佈局.

向Intent或Bundler傳數據時, 使用Parcelable而不是Serializable. 因為後者使用反射而比較慢.

不要在UI線程進行文件操作.

明白Bitmaps. 因為它們占用很多memory. Displaying Bitmaps

使用style來避免重覆的屬性設置.

需要時使用Fragment.

明白Activity的生命周期.

使用得到公認的libraries而不是自己的實現.

在各種機器上測試.

Recap Of Google Launchpad Build Lagos : All About Firebase

作者參加了一個叫Google Launchpad Build的會議, 這篇文章是總結, 全部是關於Firebase的.

Android Shared-Element Transitions for all

在Lollipop+的設備上, shared element的transition動畫很好實現, 但是在舊的版本上該怎麼辦呢? 作者展示了他的方法:

  • Activity A捕捉origin view的初始值, 通過Intent把它們傳給Activity B;
  • Activity B完全透明地啟動;
  • Activity B讀取bundle中的值, 準備場景;
  • Acitivty B運行shared element動畫.

幾個實現細節:

需要知道View在B中的位置, 時機是layout之後, 但是draw之前, 即onPreDraw().
返回時只需要把這個動畫反向播放即可.

Writing Better Adapters

(這個上一期剛講過, 不知道為什麼重覆了. )

就是關於RecyclerView的Adapter, 作者認為多種View類型時, Adapter中太多的instance of和強制類型轉換不是一種好做法, 於是提出了他的做法.

Android Wear: Accessing the Data Layer API

Data Layer API是Google Play services的一部分, 用於不同設備(手機和手錶)間的數據交換.

作者先提供了代碼, 發送和存儲數據, 監聽數據變化.

問題是, 如果Wear第二次向mobile請求數據, mobile發送了和上一次一樣的數據, Wear並不會進入onDataChanged(), 因為數據並沒有變化.

所以作者想知道如何從Data Layer API來獲取數據, 並展示了他的方法在不同情形下的應用.

Espresso Tests For TextSwitcher

作者想給TextSwitcher寫Espresso測試.

從Android Studio 2.2開始, 你可以錄製你的操作, IDE將會自動為你生成Espresso測試代碼. 但是作者錄了一個有關TextSwitcher的測試之後, 跑失敗了.

這是因為TextSwitcher繼承了ViewSwitcher, 其實現其實是把兩個TextView加到了佈局里.
所以Espresso拋出了AmbiguousViewMatcherException.

所以作者根據可見性區分了它倆, 修複了測試.
還可以根據child view的index來區分.

Animating Android Activities and Views with Slide Animations

作者展示瞭如何給Activity和View加上左右滑動的動畫.

Guide to ORM using ActiveAndroid: Part 1

這是一個系列教程, 相關的代碼在: ActiveAndroid-Tutorial

什麼是ORM(Object-Relational Mapping)呢?
a technique to convert between incompatible type-systems in an object-oriented programming language.
在面向對象的語言中, 轉換不相容的類型的技術.

ActiveAndroid是一個ORM(object relational mapper), 讓你不用寫SQL語句, 就可以讀寫資料庫.

其他類似的工具還有RealmOrmLite.

A Comparison of Android Crash Reporting Tools

作者對比了幾種崩潰報告工具, 並介紹瞭如何使用.
包括: Firebase, Crashlytics, Apteligent, Bugsnag.

Google Play Services: Google Cast v3 and Media

Google Cast是一個讓用戶把網上的內容發送到設備上的技術. 通常用來和TV交換內容.

作者詳細地介紹瞭如何使用Google Cast SDK來創建應用.

註: 要建造客戶端程式, 首先需要註冊: https://cast.google.com/publish/.
這是收費的.

ExoPlayer 2.x - It’s here (plus FAQs)!

Google的庫google/ExoPlayer升級到v2.x了.
(它是一個Media Player, YouTube用的就是它.)
這次是個重大更新, 添加了很多新功能, 推薦大家以後用新版.

How We Rethought our Complete Package Structure for Buffer on Android

作者他們重新整理了項目的包結構, 總結了整個過程還有從中學到的東東.

作者他們之前的包結構是按類型的, 有activities, fragments, adapters等包. 因為類名以類型終結, 所以索性就按整個分組.

當app變得越來越大, 這種組織方式發現就不太好, 感覺很難找東西, 並且感覺沒什麼結構.

經過改變之後, 作者他們採用了一種更加整潔並且易於導航的結構.

新結構中, 當添加一個新的feature, 就保持在同一個目錄中, 這樣就不用來回切換目錄.

作者他們的新結構有四個總目錄:

  • data
  • ui
  • injection
  • util

data中包含網路請求及相關的models, preferences, database, data models, 還有其他和數據直接關聯的東西.

其中和不同API關聯的models又分別組織在子目錄下.

ui目錄中包含所有和UI相關的組件, 在這個包中按照功能又拆分了子目錄. 其中有base包, 用來盛放Fragment, Activity和MVP的基類, 介面等; 還有common包, 用來盛放公共控制項.

injection中包含所有依賴註入的類, 分component, module和scope的子目錄.

util中含有Helper和Utility類.

Become a Firebase Taskmaster! (Part 3)

這是系列文章的第三篇, 這個系列是關於Play services的Task API.

如果項目里已經依賴了Firebase, 變自動包含了Task API, 如果不想用Firebase, 可以單獨添加依賴:
compile 'com.google.android.gms:play-services-tasks:9.6.1'

創建新的Task可以用下麵這兩個方法:

Task<TResult> call(Callable<TResult> callable)
Task<TResult> call(Executor executor, Callable<TResult> callable)

第一個call()方法在主線程執行任務, 第二個call()方法可以把工作提交給一個Executor.

Callable有點類似於Runnable:

public class CarlyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "Call me maybe";
    }
}

參數制定了方法的返回值的類型, 進而也是創建出Task的類型.

Task<String> task = Tasks.call(new CarlyCallable());

想要鏈式執行, 進行後續操作, 可以用Continuation.

public class SeparateWays implements Continuation<String, List<String>> {
    @Override
    public List<String> then(Task<String> task) throws Exception {
        return Arrays.asList(task.getResult().split(" +"));
    }
}

它繼承介面時指定了輸入和輸出的類型, 它的輸入來自於Task的輸出.

可以多寫幾個Continuation類然後連起來:

Task<String> playlist = Tasks.call(new CarlyCallable())
        .continueWith(new SeparateWays())
        .continueWith(new AllShookUp())
        .continueWith(new ComeTogether());
playlist.addOnSuccessListener(new OnSuccessListener<String>() {
    @Override
    public void onSuccess(String message) {
        // The final String with all the words randomized is here
    }
});

LIBRIARIES & CODE

groupie

顯示和管理複雜的RecyclerView佈局, 把你的items按照邏輯分組管理.

android-junit5

Gradle插件, 用JUnit5做Android的單元測試.

epoxy

用來構建複雜的RecyclerView屏.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GCD定時器 圖片上繪製文字 查找一個視圖的所有子視圖 計算文件大小 UIView的設置部分圓角 計算字元串字元長度,一個漢字算兩個字元 防止滾動視圖手勢覆蓋側滑手勢 去掉導航欄返回的標題 字元串中是否含有中文 dispatch_group的使用 UITextField每四位加一個空格,實現代理 獲 ...
  • 最近提交審核不通過,再iOS10上運行崩潰 。然後需要處理崩潰的問題,晚上找了一下,整理收集起來。 方便後續查看使用。 參考: http://blog.csdn.net/gbking/article/details/52587149 http://www.cnblogs.com/xiaoc1314/ ...
  • 轉載請標明出處: http://www.cnblogs.com/zhaoyanjun/p/5942616.html 出自[趙彥軍博客] 2016/10/09 前言:以前寫過一篇 Android studio 使用Gradle發佈Android開源項目到JCenter 總結 ,這篇文章主要介紹如何把項 ...
  • 實現一個類似於ToggleButton的開關按鈕 效果圖: 資源圖片: 1.自定義控制項類 2.xml中引用 以上,將Demo運行到模擬器上即可。 圖解: ...
  • 在《Android 手機衛士--md5加密過程》中已經實現了加密類,這裡接著實現手機防盜功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959.html,轉載請註明出處。 手機防盜業務邏輯分析 輸入密碼成功後,根據是否設置完成四個導航界面決定跳轉到導航界面 ...
  • 1.簡單使用volley 2.封裝VolleyManager 完整代碼:https://github.com/snailycy/volley_manager 註意,volley裡面的請求隊列建議使用單例,因為每次實例化ReqeustQueue並start()時,會創建1個緩存線程和4個網路請求線程, ...
  • 一個關於自定義控制項的小Demo,隨著手指移動的小球。 先看下效果圖: 實現代碼如下: 1.自定義控制項類 2.引用自定義控制項 第一種:xml中引用 第二種:代碼中引用 以上,將Demo運行到模擬器或手機上,即可實現一個紅色的圓,隨著手指觸摸移動而移動的效果。 ...
  • 1.Android Studio 將module編譯打包成aar文件,module依賴的 (例如 )不會被打包進入aar文件,應用引入該aar文件(無論是本地引入,還是網路庫引入)時,都還需要在應用(app)module的依賴中填加aar module的依賴。否則應用運行時會crash。 因此,開發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...