此篇收錄 100 Days of Google Dev 中的第 67~100 部影片摘要
100 Days of Google Dev 上集
100 Days of Google Dev 中集
67 What’s new in Android Studio 1.3
隨著 SDK 的釋出,Android Studio 在 1.3 版也 新增了一些方便的功能協助開發者開發,包含下列功能:
1. Support annotation:
– Android M 新增了 Runtime permissions 機制,但在程式中要如何得知哪些使用到的 API 需要另外要求權限呢?在 Android Studio 1.3 中會自動標註紅色底線提醒,在 lint 等靜態分析的程式也會檢查出不合格的片段,你可以透過自動完成加入 @RequiresPermission annotation 來確保自己都有加上權限檢查。
– 其他還有新增如 Threading annotations (@MainThread, @UiThread, @WorkerThread, @BinderThread),Studio 會檢查你在 background thread 執行了 UI thread 的操作並標示紅線,可透過 annotations 來標示該 method 所在的 thread。
– Value constraints (@Size, @IntRange, @FloatRange),可用來控制 array 的長度,或是確保某個數字是在指定的範圍內。
2. Private resource: 讓 resource 也可以宣告為 private 型態,限定只有自己的專案可以 include,作為第三方引用就不能拿到 resource。Public resources 則是可開放給外部引用的專案取得。
3. Memory and profiling tool: 提供了一些更方便的記憶體分析工具如 Allocation Tracker 可以用在圖表分析耗用的記憶體配置,HPROF viewer 可以抓出並分析 native 的 heap 資料。
4. 增進了 debugger 追蹤,可以更容易閱讀在中斷點處查詢的變數名稱,物件內容等
68 Finding your way with the Google Maps SDK for iOS
當我們需要描述一個位置或地方讓他人知道是相當困難的,最好的方法莫過於使用地圖來表示。
Google Maps 與 Google Places SDK 提供了 iOS 可滿足使用者的強大功能,包括全世界超過一億個地區的地圖資料,多種語言翻譯以供不同國家的人使用。另外還可看到街景實境幫助更精確找到目標,更提供了 Places API Autocomplete 方便使用者查詢地點資訊,Directions API & Map API 協助規劃路徑等實用功能。
69 Introduction to Android for Work
你是帶一台工作手機一台個人用手機嗎,大家都不願意如此,其實你可以只攜帶一支,大多的人都希望能只帶一支手機同時用於工作及個人。
用 Android for work 可以設置個人設備在工作中使用,在 2015 年初推出的 Android for work 提供了兩個功能:
一、增強了 Android 的使用經驗
二、在合作夥伴建立新的工具,增加企業價值
新的 Android for work 在 Android 5.0 引入的,能夠安全獨立的工作,並允許控制工作概況,這樣可以保持隱私也可以帶入工作,這稱為 BYOD 。
Android for work 也可以將個人及工作的資料分離,而 IT 人員也可以允許那些資料可以互通,在沒有 Android 5.0 或更新的設備下,提供了向下支援到 Android 4.0
目前可以在 Google Play 中下載,影片的最後介紹了一些合作的夥伴
70 Autoplay and Queuing for Cast
介紹 MPL preload,它支援 Android / iOS / Web
所使用到的是 Cast Queuing API 他可以做到 insert、delete、re-order、show history,不要讓它播完一首就讓使用者再去設定一首影音給予使用者 seamless media experience 很重要。
71 Chat with Macduff Hughes
Google Translate 一直持續地精進各種語言的支援度及演算法,例如一個單字或一個片語可能在不同的句子裡代表著不同的意思,這時便會有多種候選的結果供程式選擇,但是目前仍無法確保準確性。另外 Google Translate 也有提供 OCR 翻譯功能,讓你可以藉由 camera 即時翻譯拍攝到的文字。透過 Translate 社群的人們協助,讓更多的語言有著更好的翻譯,因為大家都希望自己喜歡的語言能被完美的呈現在網路上。我們也可以利用 Google Translate API 為自己的 App 提供翻譯功能。
72 Beware Autoboxing
有些時候效能問題可能是因為不起眼的小細節所引起的,例如在 Java 提供的 Autoboxing 自動裝箱功能。在 Java 中,所有您要處理的東西幾乎都是物件(Object)然而基本(Primitive)資料型態 long、int、double、float、boolean 不是物件。 有些時候需要將基本型態轉換為物件才能在大多數的 Java 容器中使用,例如使用 Map 物件要操作 put() 方法時,需要傳入的引數是物件而不是基本型態,
必須使用包裹型態(Wrapper Types)才能將基本資料型態包裝為物件。
在 J2SE 5.0 之前,要如下才能將 int 包裝為一個 Integer 物件:
Integer integer = new Integer(10);
在 J2SE 5.0 之後提供了自動裝箱的功能,您可以直接撰寫來包裹基本型態:
Integer integer = 10;
影片中用 for 迴圈的範例來解釋 Autoboxing 會帶來的效能問題,
int total = 0;
// Interger total = 0
for (int i = 0; i <100; ++i) {
total += i;
}
如果變數直接使用基本型態是不會在迴圈中配置多餘的物件,反之,如果是使用 Interger 來宣告 total 則會額外配置多餘的記憶體來 new Object(),這樣會造成記憶體的浪費。Autoboxing 的行為還經常發生在類似 HashMap 這樣的容器裡面,對 HashMap 增加刪除修改的動作都會發生大量的 Autoboxing 的行為,為了避免這些 Autoboxing 帶來的效能問題,Android 特地提供了一些使用基本型態當參數的 SparseMap 來代替 HashMap,不僅避免了 Autoboxing 還可以減少記憶體的使用。
73 How Google Play creates a highly personal store experience
目前 Android 有十億的使用者,來自 190 個國家,說著 63 種語言,每個月有 4 億個搜尋詞彙,這些使用者到 Google Play 上尋找能滿足他們的 App,這多樣性對 Google 來說是很興奮的,Google 用三個部分來看這個議題,第一是讓使用者在 Google Play 上搜尋 App,第二是給使用者個人化瀏覧體驗,第三是在這些個人化體驗中加上些許不同之處。
過去一年,Google 花費相當的資源來讓 Google Play Store 搜尋是盡量可靠的,並能讓使用者能夠方便的看到與搜尋相關的 App,最理想的目標是一個使用者能搭配一個 Store。
個人化是能增加 App 安裝率的,Google 在推薦和使用者搜尋相關的 App 外,還會在推薦清單裡加上和搜尋稍微不同的 App,除了能增加其他 App 的能見率,也能擴大使用者對其他類型 App 的興趣。
74 Google Play services 7.8
Google Play Service 7.8 主要推出了三項 API
Mobile Vision API 具備臉部辨識的 Face API 與 BarCode API
Google Cloud Messaging(GCM) 支援 localization
Nearby 用來與週圍 device 或 beacon 溝通,可用於例如投票、收集資料等,可透過 wifi 或 bluetooth 使用
75 Chat with Heidi Dohse about Cloud in Healthcare
一場關於 Google Cloud Developer - Heidi Dohse 的訪談,Heidi 18 歲被診斷出患有罕見的心律不診的疾病,因此需要裝上心律調節器,Heidi 經歷了七次更換調節器的手術,每次使用調節器也越來越進步。調節器被安裝在胸腔內,儘管平常運作正常,但患有心臟疾病的病人仍然會擔心調節器的狀態,Heidi 透過 Sensor 取得調節器的狀態,並呈現在手錶、手機等裝置或傳送給醫生,這讓她和她的醫生更了解目前身體的狀態,而這些資料可以保存在 Google Cloud,進行資料分析,分析的結果未來也可以做更多的醫療研究。
76 Cast Loud and Soft
用手機控制 google chromecast 的音量對使用者體驗很重要,第一個要做的是確認手機的音量鍵正在控制 cast 的 device,第二,它在 lock screen 也可以 work,第三,就算別的 app 在前景時也照樣可以work。但因為有些 app 限制音量控制的選項,因此當你的 app 在背景時可能無法達成目標。
另外,你的 app 提供在 screen 上的 sliders 應該可以用觸控也可以用音量鍵控制。
77 A Tale of Three CocoaPods
CocoaPods 是一個於 iOS 第三方庫管理工具,它可以從設定中幫你下載你設定好的特定版本 Library ,功能就像是 Gradle 裡的 dependicy block ,在 iOS 上使用 CocoaPods 去相依 Google 服務的時候,有兩種路徑名稱可以設置,以 Google Analytics 為例, Google/Analytics 包裡面含了 GoogleAnalytics 以及一些 Google Utility Libraries 。假設你不希望參照到那些 Utility Libraries ,則使用 GoogleAnalytics 包即可,但是一旦這麼做,就需要手動設定參數以及各項 Key 值,所以官方還是建議配合網頁 GUI 設定幫忙產生設定檔的功能,還是使用 Google/Analytics 最方便。
78 Cast Icon Positioning
為了方便使用者 cast content 到其他裝置,Google Cast 將 App 的 cast icon 放在 view 頂端的右方,提供一致性的顯示方式。Cast UX Design checklist 主要針對 Cast button、Cast menu、Sender App、Receiver App 定義了相關的狀態、顯示及行為。
相關連結:https://developers.google.com/cast/docs/design_checklist
79 SparseArray Family Ties
HashMap 因為 autoboxing 有時會導致占用過多不必要的記憶體資源 (比如 key 值不能用 int 而必須用 integer),某些狀況下建議可以改用 sparse array 。
狀況一:小於一千個 items,並且時常需要存取其中的資料。
狀況二:是個有 submaps 的 map, 並且需要 iterating over 那些 submaps 很多次。
Android performance 時常取決于你要找到對的 container 去對應對的使用情境及對的 memory case,並沒有萬用的解法,因此建議你也要去看剩下的 Android performance patterns 喲~
80 Managing Beacons with the Proximity Beacon API
Google 推出了 NearBy API,讓你可以透過裝置找到附近實體存在的點,例如巴士站、火車站、甚至室內場所如博物館的展品等,之所以找得到物體是因為 NearBy API 用到了 Wi-Fi、藍芽、超音波和這篇要介紹的 Eddystone Beacon 技術。
Google 推出了新的基於 Eddystone 標準協定的 Beacon 平台,你可以透過 Proximity beacon API 掃描 Beacon 並查詢其配對到哪一個事件,也能管理你的 Beacon 裝置的生命週期,例如註冊 beacon 裝置、偵測 beacon 狀態,是否還存活或消失。
81 Introducing Face Detection in the Google Vision APIs
現在您可以使用 Google Vision API 偵測臉部動作,更容易的創造出想要的正確畫面。
Vision API 可以使用在照片、相機與影片當中,你可以利用人臉偵測功能創造出許多有趣的應用程式甚至遊戲。
請注意,在此所指的偵測功能為臉部五官位置與動作的變化,並非人臉辨識,也就是並非辨識出畫面中的人物是誰。
臉部標示功能可以很好的識別出五官不同部位在畫面中的位置,例如嘴唇的下緣與兩側端點,鼻頭端點等等,並且可偵測出當臉部做出不同動作所代表的表情,例如閉眼、眨眼與微笑等等。
此外,API 還能夠針對不同角度的臉部進行偵測,不局限於臉部正面。
82 Big Android BBQ with Google Developers
一開始大家在烤 Android (恐怖的音樂)
然後有一個人說「我覺得我們有一個問題」
然後出現了三個人
之後就大家在互相瞪!!
中間有老鷹的叫聲還有獅子的咆哮
有人亂吐口水!!!
之後有人準備要拿烤肉夾當槍
這時出現的三個人向前走(馬蹄聲)
突然出現了一個騎著假馬的人
騎著假馬的人說「你們煮一些 BBQ?」
後面的人就拿下帽子離開了
謎之音「Google 開發人員將到 Big Android BBQ,在 10/22, 10/23 來到達拉斯沃斯堡」
在 bigandroidbbq.com 關注門票
83 Modern Animation Fundamentals
簡述 Web 前端上面做動畫的一些技巧,主要分成三塊 Declarative(陳述式) 、 Imperative(命令式) 、Procedural(循序式),Declarative 的部分簡單說為就是使用 CSS Animations,加上一些 transition property 可達成一些基本的動畫如下:
.className {
transition: opacity 1s, transform 2s;
transition: all 5s ease-in-out;
}
第二,Imperative 則是使用 Web Animations API 使用 JavaScript 去驅動的做法,要建立一個 Effect Objects 來搭配 Keyframes 來使用最後,Procedural 意思就是用 step-by-step 的方式,利用 requestAnimationFrame() 這個方法來做。一個重點是,如果您的瀏覽器是隱藏的話,你的動畫不會執行。
84 Chat with Timothy Jordan about Ubiquitous Computing
Ubiquitous computing 是一種結合各種平台達成一致性體驗的概念,例如今天我想要去跑步,並且一邊聽歌一邊記錄我的路跑狀態,目前我已經不需要帶著手機,而是靠著 Android Wear。另外像是最近提到的 Beacons,也是這種概念的一種延伸,試想使用者以前都需要告訴我們他在哪、在做些什麼才能得到他所需要的資訊,現在則可以透過 Beacons 的地利之便直接帶領使用者得到他們當下需要的資訊。例如公車資訊 App,我們可能需要輸入一些目前所在地的敏感資訊去查詢可能的公車班次,但如果 Beacons 被安裝在公車上,就可以在你到了附近的地點,就有通知在等待著你,內含一些目前班次的狀態或是改搭其他交通工具的建議等等。
85 The New Google Sign-in for iOS
在 iOS 上也可以使用 Google sign In lib 來為你的 iOS App 提供註冊功能,使用第三方註冊的 lib 的好處是,你不用擔心資料庫資安問題,因為這些 Google 都會幫你做好。
這一次新的 Google sign In lib for IOS 多了以下的改善:
1. 現在可以用 Google account 註冊,而不一定要用有 Google plus 的帳號來註冊。
2. 新的 sing In lib 的大小是之前的三分之一,這代表著 user 可以花少一點的時間來下載它。
3. 以前的註冊流程是,會先去看看 device 上有沒有裝 native Google App,如果有的話就會直接開啟來完成註冊流程,如果沒有的話則會跳轉到 Safari 上開啟相關的網站走相關流程,通常在這樣的跳轉過程中會帶給使用者不好的 user experience,所以在新的 lib 裡會直接在原有的 App 開啟 UIWebView 不需要再透過 Safari 去開啟網站。
86 The price of ENUMs
在 2009 年開始 Android developer 網頁上有提到使用 enum 可能會造成效能上的問題,不久後關於 enum 的問題被移除,但後來又被加上,但和先前提到的問題在文字上有些許差異,主要是在效能和記憶體膨脹間的不同。
當 App 載入時,Android 會給予 App 部分的系統記憶體,且為了讓 App 能運作,所有的 DEX code 會被載入至 App 的子空間,此空間會和 App 在 runtime 產生的 heap 共享,但就會對系統記憶體造成壓力,所以當記憶體過低時,可能造成 App 被關閉以適放空間。
以一個簡單的例子來看,一個原本 DEX 為 2556 Bytes 的 App,現在加上幾個 Integer 來表示某些狀態,重新編譯後,DEX 大小為 2680 Bytes;若將 Integer 改換為 enum,DEX 大小則是 4188 Bytes,明顯比使用 Integer 大的多,這就會用掉更多 heap 空間。
Google 建議可以使用 @IntDef annotation 來代替 enum。
87 Content Switcheroo Update!
Web developer library 標榜著快速建構,為 Modern Browsers 設計,還有許多 componet 可以使用。
影片中 step by step 教你如何使用 Polymer 建造一個 cat gallery
- 特色會在 裡加 component page (eg. polymer.html, iron-page.html)
- include Polymer js
- 因此只需要簡單的在 html 加上少許 tag 即可使用
- also include iron-page component to handle change gallery
- 支援 data-binding 來更新變數得值
- 1.0v adder for selected" replace 0.5v value adder" 一樣是 data binding
88 Use WordPress APIs and Android Volley to build native apps
若你的網站是用 WordPress 建立,只要安裝 WP REST API 的 Plugin,就可以利用 API 取得Json 格式的資料
,包含頁面的分類、文章等。Android Volley 是個輕鬆處理且快速的 Http Request 的函式庫,提供 Http Request
的自動排程、Cache、Concurrent 的網路連線,利用 Volley 和 WP API 便可以迅速地取得網站的資訊並建立 App。
89 Docker and Containers
容器技術是建構在 Linux 核心、檔案系統之上,幫助你精巧地封裝軟體,往後需要複製或分派執行程序時,各個容器間的環境都能保持一致,大幅減少 ”works on my machine“ 的問題。不管營運環境的規模如何,當以同樣容器交付給其他開發同仁或測試團隊,較能得到一致的行為。而 Docker 的公司將這些早存在 Linux 的 API 包裝起來,降低使用者的進入門檻。
早在 Docker 火紅之前,Google 已經在內部使用自行開發的容器技術有很長一段時間了。Google 將內部經驗及範式實作成一個名為 “Kubernetes” 的專案。它是一套 Linux 容器群集的開放源碼管理系統。可幫助你管理數以千計的容器,使數種不同的大量行程協同作業,並能在 Google Could、Compute Engine、AWS、你自己的電腦及任何地方使用。其中 Google Could 建置了免費一鍵開啟 Kubernetes 的功能,能讓開發者輕易啟動。
想進一步瞭解的話,Julia Ferraioli 曾為此寫了一系列以Minecraft為例,來整合 Kubernetes 和 Docker 的文章。
或是可以去看 Kubernetes 的官網(kubernetes.io)與Github(https://github.com/kubernetes/kubernetes)。
90 Developing for Android 6.0 Marshmallow
簡單來說就是公佈 Android 6.0 的名稱 Marshmallow ,以及提供所有開發所需要的 Support Library,並且版本升到了 Preview 3 供開發人員最最後的調教與測試,期望各位可以在上線前將您的 App 準備好相容於 6.0 。其中比較嚴重的改動就是 Apache HttpClient 將要被移除,假設有使用到相關 Lib 你需要在 Gradle 上加上對 org.apache.http.legacy 的相依,不過假如你只支援 API 14 以上的裝置,強烈的建議將 HttpClient 換成 HttpUrlConnection 。其他的新增功能請拜訪 Android M Developer Preview 網站去瞭解詳情
91 Introducing Bar Code and QR Code Detection in the Google Vision APIs
主要介紹 Barcode Scanner API 可讀寫許多格式的 barcode,操作簡單且回應快速。
1. 支援格式
- 一維:AN-13、EAN-8、UPC-A、UPC-E、Code-39、Code-93、Code-128、ITF、Codabar。
- 二維:QR Code、Data Matrix、PDF 417。
2. 架構
- 掃瞄時,會回傳一個 barcode object,利用 BarcodeDetector 解譯資訊。
3. 應用(Barcode object attribute)
- URL、聯絡人資訊、行事曆、email、電話、SMS、Wi-Fi、地理位置、駕照資訊。
4. 需求
- Google Play services: 7.8
- Google Play services SDK: rev 26
5. 範例
- //預設
- BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
- //指定格式
- BarcodeDetector detector = new BarcodeDetector.Builder(context).setBarcodeFormats(Barcode.DATA_MATRIX|Barcode.QR_CODE).build();
- 相關連結
- (1.CodeLabs、2.Mobile Vision Documentation、3.Vision API Samples)
- 1.https://search-codelabs.appspot.com/codelabs/bar-codes#1
- 2.https://developers.google.com/vision?utm_campaign=barcode-815&utm_source=dac&utm_medium=blog)
- 3.https://github.com/googlesamples/android-vision)
92 Adding Google Sign-in to your iOS App
Google Sign-in 在之前僅提供 Google+ 的連結,現在已經提供 Google account 的連結,在 Android App 中實作 Google Sign-in 非常的容易,主要是透過 GoogleApiClient 即可完成。而這部影片介紹了如何為你的 iOS App 整合 Google Sign-in 功能,首先你可以到 developers.google.com/mobile/add 選擇專案平台,輸入你的 App Id 後取得 Demo Project,接下來在 CocoaPod 添加 Google Sign-in 的 Library reference,接著你需要在專案中加入 Google OAuth 的 URL,這個 URL 在剛才專案產生頁中所產生的 plist 文件內可以找得到。Google Sign-in Library 是使用 WebView 讓用戶填入 Google Account 及密碼,再透過剛才所填的 URL 通知應用程式即可知道用戶登入過程是否成功。在 UI 方面開發者可以使用 GIDSignInButton 來顯示符合 Google guideline 的藍色登入按鍵,登出方面也很容易,只需要 GIDSignIn.sharedIntance().signOut() 一行。
93 Double Layout Taxation
Layout 佈局是 Android App 漂亮與否的核心,但若沒寫好,漂亮的 layout 可能會是嚴重影響執行性能的怪獸。每次要改變 layout 佈局上元件的位置或階層時,鄰近的元件也會跟著被改變,甚至通知到 parent view 去重新計算 layout 大小,階層越多、效能也就越差。
以下是幾點建議
1. 可利用 Systrace(註1)工具觀察你的 layout 執行時畫面渲染幀的高低,越高表示畫面越多東西需要渲染
2. 減少 layout 的結構層級(註2)
3. 避免頻繁的呼叫 requestLayout,將會觸發畫面上的其他 layout 的重繪,即使有畫面 cache 也是筆昂貴的操作
4. 觀看 Android Performace 的相關影片(lol)
5. 加入 Android Development G+ 社群提問(註3)
註1: Systrace
https://developer.android.com/intl/zh-tw/tools/debugging/systrace.html#app-trace
註2: Hierarchy Viewer
https://developer.android.com/intl/zh-tw/tools/performance/hierarchy-viewer/index.html
註3: Android Development G+ Community
https://plus.google.com/u/0/communities/116342551728637785407
94 Chrome Custom Tabs: Displaying 3rd party content in your Android app
Chrome Custom Tabs 比 WebView 更進一步能支援以下功能:
1. Customize UI: 客製 UI 和動作事件
- Toolbar color
- Start / exit animations
- Up button
- Action Button
- Menu items
2. Shared Cookie Jar: 減少使用者反覆登入
3. Chrome Features: 支援 chrome 功能
4. Performance: 背景預載可提升效能
How to Use?
- Add the suppot library
- Connecting to Chrome
- Warming Up
- Pre-fetching
- Openning the Tab
- Change the Color
請參考以下更多詳細說明:
https://developer.chrome.com/multidevice/android/customtabs
https://github.com/GoogleChrome/custom-tabs-client
95 Learn how to scale your applications with Google Compute Engine
Google Compute Engine如同Amazon EC2服務,是個雲端IaaS服務,提供了使用者更彈性的使用運算資源的方式。
GCE提供了Autoscaling & Load Balance機制,讓你製作VM Instance模板並自動偵測流量,當request/sec到達你設定的上線時就會開啟VM Instance進行負載均衡。官方提供了一些Python範例程式,幫助你用來練習、測試如何使用GCE開啟服務並且使用Loadbalance。
96 Chat with Sunil Vemuri
有空不妨可以在 Googleplex 走走,遇到一個 Googler 跟他聊聊他最近在做的事,今天邀請到 Voice actions 團隊的 Sunil Vemuri 為我們聊聊他們團隊在做的事情。Voice actions 就是使用 Ok, Google 然後接你要想要講的語音指令,他就會辨識並執行您想要做的事情。我們當初大概2013年的時候有 23% 的錯誤率,為了降低錯誤率,我們去錄了很多的 samples,25-40歲的白人男人,包含年輕的、年長的演講者甚至是小孩的聲音來加強我們的辨識準確度。在 Android 我們可以用語音指令來觸發 intent。另外在使用者訪談中,我們也發現了很多自訂的語音指令(例如: turn on the light)在新版本的 Voice actions,我們也加入了Custom actions讓開發者更方便。在 Android M 我們推出了全新的 Voice Interaction API,他除了辨識語音指令之外,還可以詢問第二個問題,並提供預設選項讓使用者能夠選擇,例如智慧家庭的 App 講了 turn on the light 這個語音指令,他就可能會問是哪盞燈,哪個房間的燈...等等。
97 Creating events in Google Calendar
我們可以透過 Google Calendar API 在日曆上新增事件,當然包括可以邀請朋友共同加入這個事件。在整合方面,也是超乎想像的便利,不只新增、刪除、修改這些基本功能,配合 Google Now 卡片與 Google Maps 連動,使用者可以在上面加入地點資訊、時間、以及其他附註。若是定期舉辦的活動,也可以設為固定事件;另外也可以在事件附上相關的檔案,例如 PDF 或是門票的照片等等。
98 Lovefield: A JavaScript Relational Database
Lovefield 是用 JavaScript 編寫,建立在 IndexedDB 的開源關聯式資料庫,它可以讓 web App 離線使用並可以在瀏覽器中運行。
Lovefield 是快速,安全,易於使用的,並且還支援了 Firefox,IE(版本10 以上)和Safari(版本 5.1以上)等瀏覽器。
Lovefield 提供類似 SQL 語法的 API,很容易學習和使用,沒有 SQL Injection 的風險。這些 API 包括基本的查詢功能 (inset,update,delete,select),transaction management,parameter binding 和 query observation。
Lovefield 還提供 integrity check,data persistence,advanced indexing 和許多其他強大的功能。
99 MapsZen - Geo APIs Tour
Roads API 可以依靠 Google Map 資料將不在道路上的 GPS point 修正到正確的道路上。
Distance Matrix API 可以用來測量目前選定的 GPS point 到另外的 point 之間的距離。
Directions API 可用來輸入地址並提供路線,包含開車、走路或搭大眾運輸工具,且可以得到預估到達時間。
Places API 可將經緯度數值轉為實際地址。
Geocoding API 可將實際地址轉為經緯度數值。
100 Trimming and Sharing Memory
目的:
手機上的資源是有限的,有限的記憶體,網路,電力,CPU 等,如果不斷的消耗這些資源,App perfrmance 會受到這些資源的消耗而有所影響,我們希望能夠在這些低資源的狀況下,讓 UX 能夠表現得最好,就需要知道一些在低資源下會發出的 callback,然後收到這些 callback 做出釋放資源來維持 App performance 的動作。
內容:
每一個 App 都會分配記憶體資源,即便這個 App 目前處於 background 狀態,有時候要啟動一個 App 發現系統的記憶體不足,系統會自動把其他 backgound App kill 掉,將記憶體給回收給其他要啟動的 App。從 backgound App switch 到 foreground 是非常快速的,但如果 backgound App 被 kill 掉了,在 switch 到 foreground ,其啟動速度是非常令人懊惱的,Android 提供一些 callback 來告訴 App 在 memory 資源低落的狀況下 App 該如何做出應對的動作:
1. onLowMemory()
- 當系統記憶體不足,所有 backgound App 都被系統給 kill,系統會呼叫 onLowMemory() callback,告訴有註冊的 Application,現在系統資源不足。
- Applicaiton 收到 onLowMemory callback ,通常的行為是釋放掉一些 memory 得資源,來維持系統的穩定性
2. onTrimMemory()
- Android 4.0 之後支援
- 相較於 onLowMemory() 只有在所有 background App 被系統 kill 的時候觸發,onTrimMemory 觸發的時機點更為頻繁,目的是讓收到 callback 的 App 知道,必須要趕快釋放記憶體,而非使用 kill 的方式將 App 移出系統。
3. isLowRamDevice()
- Android 4.4 支援
- return true: 代表這個裝置只有小於 512 MB 記憶體
- 可以藉由這個 callback 來決定,哪些功能要開啟或關閉,又或是做一些參數的變更,例如 LRU cache 記憶體的分配
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
75 和 76 一樣的內容
更新了,謝謝認真的讀者 XDDD