原文地址(QQ音樂微信公衆號首發): mp.weixin.qq.com/s?__biz=MzI…html
前段時間解決了幾個 QQ 音樂多窗口屏幕顯示的 bug,雖然這個問題最終不是 Android O 版本的問題,多窗口是 Android 7.1 以後引入的(關於多窗口適配須要注意的地方,能夠看看這篇文章:Android Multi-Window詳細介紹),可是趁此機會了解一下 Android O 版本的新特性也不錯,並且 Google IO 大會剛剛過去,趁這個熱度介紹一下。
在大會上介紹到的 Android O 新版本更新和優化主要集中在兩個方面:Fluid Experiences 和 Vitals,Fluid Experience 主要包含了四個顯著特性:Notification Dots, Picture In Picture, Autofill Framework 和 Smart Text Selection;而 Vitals 主要在電池續航、安全、啓動時間以及穩定性這幾個方面作優化。java
Android O 版本從新設計了通知,讓通知的管理更加方便,首先引入了通知渠道用來讓用戶統一管理通知,當 targetApi 設置爲 O 版本時,必需要實現一個或多個通知渠道,若是設置爲 O 版本以前的版本,在 O 版本設備上的行爲則和 7.x 版本保持一致。通知渠道提供了一種將應用內的通知變成一個個易於管理組的方法,通知渠道建立並提交到 notification manager 後,便沒法經過編程方式修改通知渠道的行爲,這些設置以後則由用戶掌控。用戶如今可使用一致的系統 UI 管理大多數與通知有關的設置。全部發布至同一通知渠道的通知都具備相同的行爲。當用戶長摁通知或者經過設置去到通知的設置頁面的時候,能夠看到這些界面:
android
在 Android O 以前,畫中畫模式已經可用於 Android TV,而 Android O 則讓這一個功能能夠支持到其餘的 Android 設備,當某個 Activity 處於 PIP 模式時,它會回調生命週期的 onPause 方法,因此此時在 PIP 模式下好比視頻播放等操做就不可以在 onPause 裏面暫停,而應該在 onStop 裏面,這一點和多窗口模式同樣,來看看它的效果:
git
咱們能夠看到在當從 youtube 視頻切換出去以後會回到桌面,這時候會有一個視頻播放的窗口懸浮在全部的應用之上,這個小窗口在播放視頻,而此時點擊這個小窗口區域會彈出幾個操做按鈕,能夠選擇關閉,或者是從新打開 youtube 視頻播放頁,並且底部的幾個按鈕也是能夠自定義的,很是方便。
這裏須要提到的一點是,升級到 8.0 的系統後不是立馬會激活這個功能,激活這個功能可能會有點複雜:github
System UI Tuner
功能,開啓的方式是下拉通知欄,長摁右下角的設置按鈕,System UI Tuner
已開啓;Settings > System > System UI Tuner > Navigation bar
,去到 navigation bar 以後選擇 extra left button type
或者 extra right button type
,選擇 keycode
,選擇完成以後返回到上一個頁面填寫 right/left keycode
爲 171
,表明將當前顯示頁面變爲 PIP 模式窗口(若是不支持頁面沒有任何反應),而後選擇一個 right/left icon
:System UI Tuner
頁面,選擇 Picture-in-Picture
模式,進去以後將 Minimize 打開便可。android:supportsPictureInPicture
設置爲 true,除了上面提到的用戶手動將 Activity 變成 PIP 模式,還可使用
Activity.enterPictureInPictureMode(PictureInPictureArgs args)
動態將 Activity 設置爲 PIP 模式,
PictureInPictureArgs
這個對象參數是用來指定 Activity 處於 PIP 模式時的行爲,此對象還指定了各類屬性,例如 Activity 的首選縱橫比,同時還可使用
Activity.setPictureInPictureArgs()
更新 Activity 的 PIP 配置設置,若是 Activity 目前處於 PIP 模式,則會更新此設置。
爲了幫助開發者更好的與設備 UI 集成,Android O 支持建立自適應圖標,系統能夠基於設備選擇的蒙版將這些圖標顯示爲不一樣形狀。系統還將實現與圖標的自動交互,並在啓動器、快捷方式、設置、共享對話框以及概覽屏幕中使用它們:
能夠經過定義兩層圖層(前景和背景)來指定桌面圖標外觀,必須提供沒有形狀和陰影的 PNG 格式圖象做爲圖層:
在之前的 Android 版本中,圖標大小定義爲 48 x 48 dp,可是如今必須按照如下的規範定義圖層大小:web
Settings > Apps & Notifications > Default apps > Autofill app
,關於如何適配自動填充框架:Autofill Framework:<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/lobster_regular" />
<font
android:fontStyle="italic"
android:fontWeight="400"
android:font="@font/lobster_italic" />
</font-family>複製代碼
同時 Android O 和 Android support library 26 提供了一個 API,能夠從另外一個應用中獲取字體資源,而不是將字體資源打包到 apk 中或者讓 apk 去下載,經過 Android support library 26 版本可讓這個特性支持到 14 版本或者之上的設備上,具體的 API 能夠看看這個:Downloadable Fonts 或者這個 sample android-DownloadableFonts:編程
這個功能在 7.1.1 以後就已經有了,長摁桌面圖標就會顯示一個 App shortcuts 菜單欄,而後長摁菜單欄上的一項,就能把它拖下來成爲單獨的一個應用圖標,被拖下來的單獨的應用圖標就是Pinned shortcuts,雖然這個功能在 7.1.1 引入的,可是在 O 版本咱們能夠經過提供的 API 按照必定的步驟去使用代碼添加:Pinning Shortcuts and Widgets。
適用場景:這個能夠將某些應用使用頻繁的小功能獨立出來,好比 QQ 的最經常使用聯繫人,音樂的聽歌識曲等功能。api
Android O 版本容許設置 TextView 的字體大小根據設置的初始大小自動放大或者縮小,這樣就可讓字體的顯示在不一樣的屏幕和不一樣的顯示內容上達到最優的效果,並且使用 Android support library 26 中的 android.support.v4.widget.TextViewCompat 可讓該特性支持到 14 版本,Android O 版本的 TextView 已經能夠支持 autosize 了,設置 autosize 特性也很是簡單,在 O 版本上,只須要使用 setAutoSizeTextTypeWithDefaults(@AutoSizeTextType int autoSizeTextType)
或者緩存
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeTextType="uniform"
/>複製代碼
就能夠了,關於使用的細節:Autosizing TextViews。
適用場景:TextView 顯示內容較多的時候,若是能夠接受的話,適當的減少字體的大小,讓顯示的字數增長。安全
Android O 版本新增 VolumeShaper 類,用來爲應用提供聲音的淡入淡出等音效;新增AudioFocusRequest 類用來提供檢測音頻焦點的新功能;新增瞭如下的方法 getMetrics 方法用來返回一個包含配置和性能信息的 Bundle 對象:
Android O 容許應用查詢和獲取設備如何發出聲音,應用能夠經過 requestAudioFocus()
函數來爲設備範圍的音頻焦點提交一個細粒度的請求,好比傳入一個 AudioFocusRequest
對象,設置對應的 type,就能夠指定獲取焦點的類型,同時能夠設置當音頻焦點被強佔時候應用的行爲,輕聲繼續播放仍是完全暫停。
值得一提的是,在 Android O 上引入了 sony 「捐贈」的 LDAC 無線聲音加密格式,用來進行高質量音樂的藍牙通訊,這樣就能夠經過藍牙耳機播放真正的無損音樂了:
1. 能夠設置 Activity 支持廣色域;
2. 能夠設置最大的屏幕寬高比;
3. 多屏幕支持,支持設備外接一個顯示器;
4. 最新版本 emoji 支持,使用 EmojiCompat
類可讓應用在老版本的應用上顯示新的 emoji;
5. 支持點擊位置的捕捉;
6. 支持設置應用類別,這些類別用於將應用呈現給用戶的用途或功能相同的應用歸類在一塊兒,例如按流量消耗、電池消耗和存儲消耗將應用歸類。
7. Smart Text Selection,這個功能有人可能在今年老羅的錘子手機發佈會上看到過,思想是很相似的,複製一段數字,就會出現直接撥打電話的選項,複製一段地址就會彈出進入地圖的選項,地圖 APP 能夠一下這個地方可否成爲一個很方便入口。
這個列舉了當前可能會影響應用的幾個行爲變動。
Android O 在當進程進入已緩存狀態時,若是沒有活動的組件,系統將解除應用具備的全部喚醒鎖(已緩存狀態指的是沒有前臺 Activity 或者正在執行的前臺 Service)。同時 Android O 上運行在後臺的應用將會有限制的使用後臺的 Service,而且應用也不能在 Manifest 中註冊一些沒必要要的隱式廣播用來進行自啓等操做:
Android O 包含如下與安全性有關的變動:
Android O 對網絡鏈接和 HTTP(S) 鏈接行爲作出了很多變動,其中包括無正文的 OPTIONS 請求如今有 Content-Length: 0 標頭;HttpURLConnection 在包含斜線的主機或頒發機構名稱後面附加一條斜線,將 example.com 轉化爲 example.com/ ;經過 ProxySelector.setDefault() 設置的自定義代理選擇器的範圍變化;URI 不能包含空白標籤;若是以前執行的 connect() 方法失敗,send(java.net.DatagramPacket) 方法將會引起 SocketException;在回退到 TCP Echo 協議以前,InetAddress.isReachable() 會嘗試執行 ICMP;隧道 HTTP(S) 鏈接處理進行了一些變動。
變動內容比較繁多:網絡鏈接和 HTTP(S) 鏈接。
在 Android O 以前,若是應用在運行時請求權限而且被授予該權限,系統會錯誤地將屬於同一權限組而且在清單中註冊的其餘權限也一塊兒授予應用。對於針對 Android O 的應用,此行爲已被糾正。系統只會授予應用明確請求的權限。然而,一旦用戶爲應用授予某個權限,則全部後續對該權限組中權限的請求都將被自動批准。
在針對 Android O 的應用中,若是 Native libraries 包含任何可寫且可執行的代碼段,則不會再加載 Native libraries,可寫和可執行必須是在新版本必須是互斥的,假若某些應用的 Native libraries 包含不正確的加載代碼段,則此變動可能會致使這些應用中止工做,官方文檔:Writable and Executable Segments。
1. ContentProvider 支持分頁,即獲取內容的選中區域的子集;
2. ContentProvider 和 ContentResolver 增長 refresh 方法,用來讓客戶端更容易的知道數據是否是最新;
3. JobScheduler 更新,讓應用更容易聽從後臺執行限制;
4. 集合的處理的變化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始終引起 NullPointerException;
5. 語言區域和國際化變化;
6. 聯繫人提供程序使用狀況統計方法的變動;
7. 藍牙 ScanRecord.getBytes() 方法檢索的數據長度變動;
8. 輸入和導航;
Android O 預覽版本提供了幾個新的 API 用來管理 WebView:
PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);複製代碼
<manifest>
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
...
<application> ... </application>
</manifest>複製代碼
Termination Handle API
一塊兒搭配使用;
findViewById 函數如今返回的是 <T extends View>,因此之後 findViewById 就不須要強轉了。
Android 引入了幾個新的 xml 屬性:
layout_marginVertical
,同時設置 layout_marginTop
和 layout_marginBottom
屬性;layout_marginHorizontal
,同時設置 layout_marginLeft
和 layout_marginRight
屬性;paddingVertical
,同時設置 paddingTop
和 paddingBottom
屬性;paddingHorizontal
,同時設置 paddingLeft
和 paddingRight
屬性;Android O 中,AnimationSet API 如今支持了動畫的 seek 和動畫倒轉播放,seek 操做能夠設置 AnimationSet 從指定的點開始播放,倒轉播放則將之前須要重複定義兩個相反的動畫操做簡化成只須要定義一個動畫便可。
在 Android O 版本以前,應用若是不用 type_toast 顯示懸浮窗,通常正常狀況下都會使用聲明 SYSTEM_ALERT_WINDOW 權限 + 使用 TYPE_SYSTEM_ERROR 的形式來顯示懸浮窗,國內的第三方 ROM 也會對此有限制,Android 6.0 版本曾經對懸浮窗有過一次限制,必需要用戶手動開啓「在其餘應用之上顯示」的權限才能展現懸浮窗,在 Android O 以後 SYSTEM_ALERT_WINDOW 權限的應用沒法再使用如下窗口類型來在其餘應用和系統窗口上方顯示提醒窗口: