Android進階之光-第1章-Android新特性-讀書筆記

第 1 章 Android 新特性

1.1 Android 5.0 新特性

1.1.1 Android 5.0 主要新特性

1. 全新的 Material Design 新風格

  Material Design 是一種大膽的平面化創新。換句話說,谷歌希望能夠讓Material Design 給用戶帶來紙張化的體驗。這種新的視覺語言,在基本元素的處理上,借鑑了傳統的印刷設計,以及字體版式、網絡系統、空間、比例、配色和圖像使用等這些基礎的平面設計規範。另外,Material Design 還推崇實體隱喻理念,利用實體的表面與邊緣的質感打造出視覺線索。讓用戶感受到真實性。熟悉的觸感讓用戶可以快速地理解並認知。在設計中可以在符合物理規律的基礎上靈活地運用物質,打造出不同的使用體驗。爲了吸引用戶的注意力,Material Design 還帶來了有意義而且更合理的動態效果,以及維持整個系統的連續性體驗。

2. 支持多種設備

  Android 系統的身影早已出現在多種設備中。

3. 全新的通知中心設計

  谷歌在 Android 5.0 中加入了全新風格的通知系統。改進後的通知系統會優先顯示對用戶來說比較重要的信息,而將不太緊急的內容隱藏起來。用戶只需要向下滑動就可以查看全部的通知內容。

4. 支持 64 位 ART 虛擬機(ART:Android runtime)

  Android 5.0 內部的性能上也提升了不少,它放棄了之前一直使用的 Dalvik 虛擬機,改用了 ART 虛擬機,實現了真正的跨平臺編譯,在 ART、X86、MIPS 等無處不在。

5. Overview

  多任務視窗現在有了一個新的名字,Overview 。在界面上,每一個 App 都是一個獨立的卡片,擁有立體式的層疊效果,用戶可以指定 “最近應用程序”,通過滑動來快速切換 App。

6. 設備識別解鎖

  Android 5.0 增加了針對特定設備(例如智能手錶)識別解鎖的模式。當設備沒有檢測到附近有可用的信任設備時,就會啓動安全模式以防止未授權訪問。

7. Ok Google 語音指令

  只需要說出簡單的語言指令,就能操作手機。

8. Face unlock 面部解鎖

  在 Android 5.0 中,Google 花費大力氣優化了面部解鎖功能。當用戶拿起手機處理鎖屏界面上的消息通知時,面部解鎖功能便自動被激活。

1.1.2 替換 ListView 和 GridView 的 RecyclerView

  有了 ListView、GridView,爲什麼還需要 RecyclerView 這樣的控件呢?從整體上看,RecyclerView 架構提供了一種插拔式的體驗,它具有高度的解耦、異常的靈活性和更高的效率,通過設置它提供的不同 LayoutManager、ItemDecoration、ItemAnimator 可實現更加豐富多樣的效果。但是 RecyclewView 也有缺點和讓人頭疼的地方:設置列表的分割線需要自定義,另外列表的點擊事件需要自己去實現。

1. 配置 build.gradle

  要想使用 RecyclerView,首先要倒入 support-7 包。

2. 使用 RecyclerView

  與 ListView 不同的一點就是,需要設置佈局管理器用於設置條目的排列樣式,可以是垂直排列或者水平排列。

  此外,RecyclerView 比 ListView 的設置要複雜一些,主要是它需要自己去自定義分割線,設置動畫和佈局管理器,等等。

  RecyclerView 的 Adapter 最大的改進就是對 ViewHolder 進行了封裝定義,只需要自定義一個 ViewHolder 繼承 RecyclerView.ViewHolder 就可以了。另外,Adapter 繼承了 RecyclerView.Adapter,在 onCreateViewHolder 中加載佈局,在 onBindViewHolder 中將視圖與數據進行綁定。

3. 設置分割線

  可以使用 mRecyclerView.addItemDecoration() 來加入分割線。谷歌目前沒有提供默認的分割線,這就需要我們繼承 RecyclerView.ItemDecoration 來自定義分割線。

  雖然沒有默認的分割線,但是好處是:可以更靈活地自定義分割線。

4. 自定義點擊事件

  列表中條目的點擊事件需要自己來定義,這是一個不盡如人意的地方。但是,自定義點擊事件也並不是很難。在 Adapter 中定義接口並提供回調。

5. 實現 GridView

  只需要自定義橫向的分割線。

6. 實現瀑布流

  RecyclerView 支持瀑布流,它更穩定、效率更高、自定義能力更強。

  實現瀑布流很簡單,只要在 Adapter 寫一個隨機的高度來控制每個 item 的高度就可以了。在 Adapter 的 onBindViewHolder 中設置每個 item 的高度。

1.1.3 卡片 CardView

  Android 5.0 版本中新增了 CardView,CardView 繼承自 FrameLayout 類,並且可以設置圓角和陰影,使得空間具有立體性,也可以包含其他的佈局容器和控件。

1. 配置 build.gradle

  如果 SDK 低於 5.0,仍舊要引入 v7 包。在 build.gradle 中引入 support-v7 包。

2. 使用 CardView

  CardView 的重要屬性:card_view:cardCornerRadius,設置圓角半徑:card_view:cardElevation,設置陰影的半徑。

  初次之外,CardView 還有其他屬性:

  • CardView_cardBackgroundColor:設置背景色。
  • CardView_cardElevation:設置 Z 軸陰影。
  • CardView_cardMaxElevation:設置 Z 軸最大高度值。
  • CardView_cardUseCompatPadding:是否使用 CompadPadding。
  • CardView_cardPreventComerOverlap:是否使用 PreventCornerOverlap。
  • CardView_contentPadding;內容的 padding。
  • CardView_contentPaddingLeft:內容的左 padding。
  • CardView_contentPaddingTop:內容的上 padding。
  • CardView_contentPaddingRight:內容的右 padding。
  • CardView_contentPaddingBottom:內容的底 padding。

1.1.4 3 種 Notification

  Notification 可以讓我們在獲得消息的時候,在狀態欄,鎖屏界面來現實相應的信息。

1. 普通 Notification

  普通 Notification 的創建。

2. 摺疊式 Notification

  摺疊式 Notification 是一種自定義視圖的 Notification,用來顯示長文本和一些自定義的佈局場景。它的兩種狀態:一種是普通狀態下的視圖(如果不是自定義的話,和上面普通 Notification 的視圖樣式一樣),另一種是展開狀態下的視圖。和普通 Notification 不同的是,需要自定義視圖,而這個視圖現實的進程和我們創建視圖的進程不在一個進程,所以需要使用 RemoteViews。

3. 懸掛式 Notification

  懸掛式 Notification 是 Android 5.0 新增加的方式。和前兩種顯示方式不同的是,前兩種需要下拉通知欄才能看到通知;而懸掛式 Notification 不需要下拉通知欄就直接顯示出來懸掛在屏幕上方,並且焦點不變,仍在用戶操作的界面,因此不會打斷用戶的操作。其過幾秒就會自動消失。和前兩種 Notification 不同的是,它需要調用 setFullScreenIntent 來將 Notification 變爲懸掛式 Notification 。

4. Notification 的顯示等級

  Android 5.0 加入了一種新的模式 Notification 的顯示等級,共有以下 3 種。

  • VISIBILITY_PUBLIC:任何情況都會顯示通知。
  • VISIBILITY_PRIVATE:只有在沒有鎖屏時會顯示通知。
  • VISIBILITY_SECRET:在 pin、password 等安全鎖和沒有鎖屏的情況下才能顯示通知。

  設置非常簡單,只要調用 setVisibility 方法就可以了。

1.1.5 Toolbar 與 Palette

  Toolbar 是應用內容的標準工具欄,可以說是 Actionbar 的升級版。這兩者不是獨立關係,要使用 Toolbar,還是得跟 Actionbar 有關係的。相比於 Actionbar,Toolbar 最明顯的一點就是變得很自由,可隨處放置,其具體使用方法和 Actionbar 很類似。

1. 引入 Toolbar

  引入 v7 支持包。

  爲了顯示 Toolbar 控件,先要在 style 裏把 Actionbar 去掉。

2. 自定義 Toolbar

  可以設置 Toolbar 的標題和圖標以及 Menu Item 等屬性。Menu Item 的設置和 Actionbar 類似。

3. 添加 DrawerLayout 實現側滑

  使用 DrawerLayout 實現側滑。

4. Palette 的應用

  Android 5.x 用 Palette 來提取顏色,從而讓主題能夠動態適應當前界面的色調,做到整個 App 顏色的基調和諧統一。Android 內置了幾種提取色調的種類:

  • Vibrant (充滿活力的)
  • Vibrant dark (充滿活力的黑)
  • Vibrant light (充滿活力的亮)
  • Muted (柔和的)
  • Muted dark (柔和的黑)
  • Muted light (柔和的亮)
      要使用 Palette ,需要引用 ‘com.android.support:palette-v7:23.0.1’。這在之前已經配置過了,實現提取顏色非常容易,只要將 bitmap 傳遞給 Palette,調用 generate 即可。在 onGenerated 回調中得到圖片的色調。

1.2 Android 6.0 新特性

  6.0 新系統的整體設計風格依然保持扁平化的 Material Design 風格。Android 6.0 在對軟件體驗與運行性能上進行了大幅度的優化。據測試,Android 6.0 可使設備續航時間提升 30%。

1.2.1 Android 6.0 主要新特性概述

1. 應用權限管理

  在 Android 6.0 中,應用許可提示可以自定義了。它允許對應用的權限進行高度管理,比如應用能否使用位置、相機、網絡和通信錄等,這些都開放給開發者和用戶。此前的 Android 系統的應用權限管理只能靠第三方應用來實現,在 Android 6.0 中應用權限管理成爲系統級的功能。

2. Android Pay

  Android Pay 是 Android 支付統一標準。Android 6.0 系統中集成了 Android Pay,其特性在於簡潔、安全和可選性。它是一個開放性平臺,用戶可以選擇谷歌的服務或者使用銀行的 App 來使用它。Android Pay 支持 Android 4.4 以後的系統設備並且可以使用指紋來進行支付。

3. 指紋支持

  雖然很多廠商的 Android 手機實現了指紋的支持,但是這些手機都使用了非谷歌認證的技術。這一次谷歌提供的指紋識別支持,旨在統一指紋識別的技術方案。

4. Doze 電量管理

  Android 6.0 自帶 Doze 電量管理功能。手機靜止不動一段時間後,會進入 Doze 電量管理模式。谷歌表示,當屏幕處於關閉狀態時,平均續航時間可提高 30%。

  Android 6.0 加強了軟件間的關聯,允許開發者將 App 和他們的 Web 域名關聯。

6. Now on Tap

  在桌面或 App 的任意界面,長按 Home 鍵即可激活 Now on Tap,它會識別當前屏幕上的內容並創建 Now 卡片。

1.2.2 運行時權限機制

  在 Android 6.0 時,將不會在安裝的時候授予權限;取而代之的是,App 不得不在運行時一個一個詢問用戶來授予權限。

1. Android 6.0 之前版本的應對之策

  Android 6.0 系統默認爲 targetSdkVersion 小於 23 的應用授予了所申請的所有權限,所以如果你以前的 App 設置的 targetSdkVersion 低於 23,在運行時也不會崩潰。

2. Normal Permissions 與 Dangerous Permission

  Google 將權限分爲兩類,一類是 Normal Permissions,這類權限一般不涉及用戶隱式,是無須用戶進行授權的,比如手機振動、訪問網絡等,這些權限只需要在 AndroidManifest.xml 中簡單聲明就好,安裝時就授權,無須每次使用時都檢查權限,而且用戶不能取消以上授權;另一類是 Dangerous Permission,一般會設計用戶隱私,需要用戶進行授權,比如讀取 adcard、訪問通信錄等。

Normal Permissions
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.KILL_BACKGROUND_PROCESSED
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

  Dangerous Permission

Permission GroupPermissions
android.permission-group.CALENDAR android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR
android.permission-group.CAMERA android.permission.CAMERA
android.permission-group.LOCATION android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION
android.permission-group.PHONE android.permission.READ_PHOTO_STATE android.permission.CALL_PHOTO android.permission.READ_CALL_LOG android.permission.WRITE_CALL_LOG com.android.voicemail.permission.ADD_VOICEMAIL android.permission.USE_SIP android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS android.permission.BODY_SENSORS
android.permission-group.SMS android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.READ_SMS android.permission.RECEIVE_WAP_PUSH android.permission.RECEIVE_MMS android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE

  同一組的任何一個權限被授權了,其他權限也自動被授權。此外,對於申請時彈出的提示框上面的文本說明也是對整個權限組的說明,而不是單個權限的說明。

3. 實現支持運行時權限

  舉例獲取電話權限。

4. 處理“不再詢問”選項

  如果用戶選擇了“不再詢問”,那麼每次我們調用需要訪問該權限的 API 時都會失效,這顯然不會帶來好的用戶體驗,所以我們需要做的就是給用戶一個友好的提示。這時候需要使用 shouldShowRequestPermissionRationale 方法,這個方法可以幫助開發者向用戶解釋權限的情況。如果用戶選擇了“不再詢問”選項,則 shouldShowRequestPermissionRationale 方法會返回 false,這時候就可以彈出 AlertDialog 來提醒用戶允許訪問該權限的重要性。

5. PermissionDispatcher 框架的使用

  PermissionDispatcher 框架用來封裝請求權限。
 使用 PermissionDispatcher 的例子。

1.3 Android 7.0 新特性

1.3.1 Android 7.0 主要新特性概述

1. 多窗口模式

  Android 7.0 中支持多窗口多任務處理,你只要在一個應用程序中長按 Overview 按鈕,就能進入多窗口模式。在大屏幕設備中,同時打開兩個應用程序窗口顯然可以提升執行效率。

2. Data Server

  Android 7.0 中引入了 Data Server 模式,它是一種流量保護機制。啓動 Data Server 模式時,系統將攔截後臺的數據使用,並在可能的情況下減少前臺運行應用使用的數據量。例如限制流媒體服務的碼率,下調畫質,以及減少緩存等。而通過白名單設置,用戶可以讓應用避免受到 Data Server 模式的影響。

3. 改進的 Java 8 語言支持

  Android 7.0 可以支持 Java 8 語言平臺,使得 Android 的 Jack 編譯器現在能夠有助於減少系統的冗餘代碼、降低佔用和運行時間。開發者可以直接用 Lambda 表達式。

4. 自定義壁紙

  在 Android 7.0 中,可以爲主屏幕設置壁紙,爲鎖屏設置另外一張壁紙。

5. 快速回復

  Android 7.0 還支持通知欄直接回復的功能。值得注意的是,這個功能不僅僅限於即時通信應用,它還適用於諸如 Twitter 這樣的社交應用。

6. Daydream VR 支持

  Android 7.0 內置谷歌的全新 VR 平臺 Daydream。Daydream 是一個虛擬現實平臺,由 Daydream 頭盔、手柄和只能手機構成,支持 Daydream 的智能手機要滿足一定的硬件要求。

7. 後臺省電

  Android 7.0 在後臺省電方面也做了不小的改進,屏幕關閉後所有的後臺進程都將會被系統限制活動,使這些應用不會在後臺中持續喚醒,從而達到省電的目的。此外,Project Svelte 功能也在持續地改善,這最大限度地減少了 Android 設備中系統和應用所佔用的內存。

8. 快速設置

  下拉通知欄頂部可以展開快捷開關界面。在快捷開關界面右下角有個“編輯”(EDIT)按鈕,點擊之後即可自定義添加/刪除快捷開關,或拖動進行排序。

9. Unicode 9 支持和全新的 emoji 表情符號

  Android 7.0 支持 Unicode 9,並且新增了大約 70 種 emoji 表情符號。這些表情符號大多數都是人形的,並且提供不同的膚色。

10. Google Assistant

  Google Assistant 號稱融合了谷歌搜索的深度學習技術以及 Google Now 的個人信息學習技術,它能夠分辨用戶的自然語言,並具備練習上下文的理解能力。它能夠按照你的談話內容和習慣來調整自己的推薦建議,最終能夠形成一種適合於用戶本人的模式,爲用戶的日常生活提供幫助。

1.3.2 多窗口模式

1. 進入多窗口模式

  進入多窗口模式有兩種方式:

  • 點擊手機導航欄最右邊的 Overview 按鈕進入 Overview 列表,長按列表中的活動窗口並拖入到屏幕最上方的分屏顯示區域。
  • 打開一個程序,長按 Overview 按鈕也可以進入多窗口模式。
2. 多窗口模式的生命週期

  長按進入多窗口模式時,生命週期方法:onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResumt() -> onPause()。經歷了一個重新創建的過程,最終會停留在 onPause() 狀態,當點擊項目的窗口時,纔會獲取焦點進入 onResume 狀態。

  長按 Overview 按鈕退出多窗口模式,生命週期方法:onstop() -> onDestory() -> onCreate() -> onStart() -> onResume() -> onPause() -> onResume() 。先經歷了銷燬的過程,然後是一個重新恢復的過程,最終會停留在 onResume 狀態。

3. 禁用多窗口模式

  多窗口模式未必適用於所有應用。如果想要禁用多窗口模式,只需要在 AndroidManifest.xml 中加入如下屬性即可:

<application
    ...
    android:resizeableAcivity = "false"
    ...
</application>

  設置 android:resizeableAcivity 屬性爲 false ,當長按 Overview 按鈕想要進入多窗口模式時,會發現項目無法進入多窗口模式,並會彈出 Toast 來提醒用戶當前應用不支持多窗口模式。

1.4 本章小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章