Android O新特性和行爲變動總結

原文地址(QQ音樂微信公衆號首發): mp.weixin.qq.com/s?__biz=MzI…html

1. Android O 新特性

  前段時間解決了幾個 QQ 音樂多窗口屏幕顯示的 bug,雖然這個問題最終不是 Android O 版本的問題,多窗口是 Android 7.1 以後引入的(關於多窗口適配須要注意的地方,能夠看看這篇文章:Android Multi-Window詳細介紹),可是趁此機會了解一下 Android O 版本的新特性也不錯,並且 Google IO 大會剛剛過去,趁這個熱度介紹一下。
  在大會上介紹到的 Android O 新版本更新和優化主要集中在兩個方面:Fluid ExperiencesVitalsFluid Experience 主要包含了四個顯著特性:Notification Dots, Picture In Picture, Autofill Framework 和 Smart Text Selection;Vitals 主要在電池續航、安全、啓動時間以及穩定性這幾個方面作優化。java

1.1 通知變動

  Android O 版本從新設計了通知,讓通知的管理更加方便,首先引入了通知渠道用來讓用戶統一管理通知,當 targetApi 設置爲 O 版本時,必需要實現一個或多個通知渠道,若是設置爲 O 版本以前的版本,在 O 版本設備上的行爲則和 7.x 版本保持一致。通知渠道提供了一種將應用內的通知變成一個個易於管理組的方法,通知渠道建立並提交到 notification manager 後,便沒法經過編程方式修改通知渠道的行爲,這些設置以後則由用戶掌控。用戶如今可使用一致的系統 UI 管理大多數與通知有關的設置。全部發布至同一通知渠道的通知都具備相同的行爲。當用戶長摁通知或者經過設置去到通知的設置頁面的時候,能夠看到這些界面:
android


經過這個設置頁面能夠看到,用戶能夠將應用全部的通知渠道關閉,或者關閉某一個單獨的通知渠道,每個通知渠道也有相應的行爲,用戶能夠去自行修改,好比修改通知渠道的優先級,若是支持的話,用戶還能夠去聲明通知是否同時顯示爲應用的角標。Android O 還引入了通知角標,當一個應用的通知沒有 dismiss 的時候,會在應用的圖標上面顯示一個角標,長摁這個應用的圖標,也會顯示通知的詳情信息:

  O 版本棄用了對單個通知設置優先級的功能,如今是對通知渠道設置優先級,該通知渠道的全部通知都適用於該優先級,優先級從 IMPORTANCE_NONE(0)IMPORTANCE_HIGH(4),對用戶的提醒等級從小到大。關於建立通知渠道組,向渠道組發送通知或者修改通知渠道組設置的代碼能夠查看 Google 文檔: 通知渠道
  同時還引入了一個通知睡眠的功能,用戶能夠休眠一個通知,讓它在指定的時候再出現,被休眠的時候仍然能夠修改這個通知的設置,可是不會讓這個通知立馬出現。另外還能夠設置一個通知的超時時間,用來讓某個通知在一段時間以後被自動 cancel。其餘的好比能夠獲取通知的清除方式,修改通知的背景顏色,修改通知的樣式能夠看官方文檔: Android O-通知
   使用場景:針對應用的不一樣優先級別的通知設置不一樣的通知渠道,強提醒能夠發出聲音加震動,弱提醒可能僅僅只須要呼吸燈和角標這樣等,這樣能夠最大程度減小對用戶的干擾。

1.2 畫中畫模式

  在 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 keycode171,表明將當前顯示頁面變爲 PIP 模式窗口(若是不支持頁面沒有任何反應),而後選擇一個 right/left icon

    以後就會在導航欄上出現一個新增的按鈕,這個按鈕就是用來將頁面進入 PIP 模式;
  • 第三步再返回上一個System UI Tuner頁面,選擇 Picture-in-Picture 模式,進去以後將 Minimize 打開便可。

完成上面的操做以後,進入支持 PIP 模式的頁面,好比 youtube 的視頻播放頁面,點擊導航欄新增的那個按鈕,頁面就會縮小到一個小窗口播放,如上面的實例圖片所示。
  要指定 Activity 可使用 PIP 模式,須要在 Manifest文件中將 android:supportsPictureInPicture 設置爲 true,除了上面提到的用戶手動將 Activity 變成 PIP 模式,還可使用 Activity.enterPictureInPictureMode(PictureInPictureArgs args) 動態將 Activity 設置爲 PIP 模式, PictureInPictureArgs 這個對象參數是用來指定 Activity 處於 PIP 模式時的行爲,此對象還指定了各類屬性,例如 Activity 的首選縱橫比,同時還可使用 Activity.setPictureInPictureArgs() 更新 Activity 的 PIP 配置設置,若是 Activity 目前處於 PIP 模式,則會更新此設置。
   使用場景:這個功能就很貼心了,比起之前的 Multi-window,這個更強調兩個應用的主次之分,比較適合的場景可能有視頻播放頁面的最小化,地圖應用的最小化等等。針對 QQ 音樂來講可使用在直播頁面,MV 播放頁面等等。

1.3 自適應圖標

  爲了幫助開發者更好的與設備 UI 集成,Android O 支持建立自適應圖標,系統能夠基於設備選擇的蒙版將這些圖標顯示爲不一樣形狀。系統還將實現與圖標的自動交互,並在啓動器、快捷方式、設置、共享對話框以及概覽屏幕中使用它們:


  能夠經過定義兩層圖層(前景和背景)來指定桌面圖標外觀,必須提供沒有形狀和陰影的 PNG 格式圖象做爲圖層:

  在之前的 Android 版本中,圖標大小定義爲 48 x 48 dp,可是如今必須按照如下的規範定義圖層大小:web

  1. 兩張圖層大小都必須爲 108 x 108 dp。
  2. 圖層中心 72 x 72 dp 範圍爲可視範圍。
  3. 系統會保留四周的 18dp 範圍用於生成有趣的視覺效果(如視差和跳動):

      建立自適應圖標能夠參考:Create adaptive icons with Android Studio

      這個就將之前混亂的圖標統一化了,如今 Android 不少應用的圖標,有的是正方形的,有的帶圓弧,並且這圓弧的弧度各有差別,有的圖標仍是圓形,有的則是不規則的圖片,統一以後全部的應用圖標將具備一致的風格,比較推薦。

    1.4 自動填充框架

      Android O 還引入了自動填充框架,簡化了用戶在帳號建立、登陸和信用卡表單之類的填寫工做,在用戶選擇自動填充框架以後,新老用戶均可以使用自動填充框架,咱們使用 Chrome 的時候已經體驗過了自動填充用戶名和密碼的功能,只不過此次是在系統層面提供了這樣的一種功能,能夠快速的填充用戶名,地址甚至密碼等,並且用戶也不須要去擔憂安全問題。
      一樣自動填充框架也須要去設置頁面打開: Settings > Apps & Notifications > Default apps > Autofill app,關於如何適配自動填充框架:Autofill Framework

      這個場景能夠參考 Chrome 的記住帳號和密碼功能,例如如今的 QQ 登陸實際上是已經作了一個相似的 Auto-Fill 功能,比較適合用在帳號密碼等場景上。

    1.5 xml 字體和可下載字體

      Android O 推出了 xml 字體,能夠在資源文件中創建 font 字體資源文件夾,放入相應的字體 ttf 文件,而後創建本身的字體 xml 文件,在 R 文件中編譯,最終做爲一種資源供 TextView 等使用,
<?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編程


   適用場景:這個比較適合在公司的一系列 APP 上使用,更換皮膚同時更換字體等等。

1.6 Pinned Shortcut

  
  這個功能在 7.1.1 以後就已經有了,長摁桌面圖標就會顯示一個 App shortcuts 菜單欄,而後長摁菜單欄上的一項,就能把它拖下來成爲單獨的一個應用圖標,被拖下來的單獨的應用圖標就是Pinned shortcuts,雖然這個功能在 7.1.1 引入的,可是在 O 版本咱們能夠經過提供的 API 按照必定的步驟去使用代碼添加:Pinning Shortcuts and Widgets
  適用場景:這個能夠將某些應用使用頻繁的小功能獨立出來,好比 QQ 的最經常使用聯繫人,音樂的聽歌識曲等功能。api

1.7 TextView 字體自動適配

  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 顯示內容較多的時候,若是能夠接受的話,適當的減少字體的大小,讓顯示的字數增長。安全

1.8 媒體加強

  Android O 版本新增 VolumeShaper 類,用來爲應用提供聲音的淡入淡出等音效;新增AudioFocusRequest 類用來提供檢測音頻焦點的新功能;新增瞭如下的方法 getMetrics 方法用來返回一個包含配置和性能信息的 Bundle 對象:

  • MediaPlayer.getMetrics()
  • MediaRecorder.getMetrics()
  • MediaCodec.getMetrics()
  • MediaExtractor.getMetrics()

  MediaPlayer 新增了一些新的方法,這些方法能夠用來加強應用處理媒體播放的能力:
  • 經過控制緩衝行爲改進性能的功能;
  • 在搜索幀時進行精細控制;
  • 播放受數字版權管理保護的材料的功能(和 MediaDrm 類功能相似,可是不一樣的是這個不會暴露底層的提取器,版權和加密數據:DRM support)。

  音頻錄製器 MediaRecorder 如今支持對流式傳輸有用的 MPEG2_TS 格式,MediaMuxer 如今能夠處理任意數量的音頻和視頻流,而再也不僅限於一個音頻曲目和/或一個視頻曲目。使用 addTrack() 可混錄所需的任意數量的曲目,MediaMuxer 還能夠添加一個或多個包含用戶定義的每幀信息的元數據曲目。元數據的格式由應用定義。僅對 MP4 容器支持元數據曲目。

1.8.1 音頻播放設置

  Android O 容許應用查詢和獲取設備如何發出聲音,應用能夠經過 requestAudioFocus()函數來爲設備範圍的音頻焦點提交一個細粒度的請求,好比傳入一個 AudioFocusRequest 對象,設置對應的 type,就能夠指定獲取焦點的類型,同時能夠設置當音頻焦點被強佔時候應用的行爲,輕聲繼續播放仍是完全暫停。

1.8.2 LDAC 音質加強

  值得一提的是,在 Android O 上引入了 sony 「捐贈」的 LDAC 無線聲音加密格式,用來進行高質量音樂的藍牙通訊,這樣就能夠經過藍牙耳機播放真正的無損音樂了:


能夠看到使用了 LDAC 無線聲音加密協議以後,最高能夠達到 990kbps 的傳輸速率,好消息是否是!可是惋惜的是 LDAC 只能再 sony 製造的耳機上使用,好比 £330 MDR-1000X,高呼 Sony大法好~~

1.9 其餘特性

  1. 能夠設置 Activity 支持廣色域;
  2. 能夠設置最大的屏幕寬高比;
  3. 多屏幕支持,支持設備外接一個顯示器;
  4. 最新版本 emoji 支持,使用 EmojiCompat 類可讓應用在老版本的應用上顯示新的 emoji;
  5. 支持點擊位置的捕捉;
  6. 支持設置應用類別,這些類別用於將應用呈現給用戶的用途或功能相同的應用歸類在一塊兒,例如按流量消耗、電池消耗和存儲消耗將應用歸類。
  7. Smart Text Selection,這個功能有人可能在今年老羅的錘子手機發佈會上看到過,思想是很相似的,複製一段數字,就會出現直接撥打電話的選項,複製一段地址就會彈出進入地圖的選項,地圖 APP 能夠一下這個地方可否成爲一個很方便入口。

2 Android O 版本行爲變動

  這個列舉了當前可能會影響應用的幾個行爲變動。

2.1 後臺執行限制

  Android O 在當進程進入已緩存狀態時,若是沒有活動的組件,系統將解除應用具備的全部喚醒鎖(已緩存狀態指的是沒有前臺 Activity 或者正在執行的前臺 Service)。同時 Android O 上運行在後臺的應用將會有限制的使用後臺的 Service,而且應用也不能在 Manifest 中註冊一些沒必要要的隱式廣播用來進行自啓等操做:

  • 在後臺運行的應用對後臺服務的訪問受到限制;
  • 應用沒法使用其清單註冊大部分隱式廣播(即並不是專門針對此應用的廣播,好比 ACTION_PACKAGE_REPLACED 針對全部應用是一個隱式廣播,而ACTION_MY_PACKAGE_REPLACED只針對本應用就不是一個隱式廣播)。
上面的限制針對 targetApi 爲 O 和之上的應用生效,可是用戶能夠在設置頁面設置讓這個限制對全部 targetApi 的應用生效。
  處於前臺時,應用能夠自由建立和運行前臺服務與後臺服務。 進入後臺時,在某些狀況下,在一個持續數分鐘的時間窗內,應用仍能夠建立和使用服務,這些狀況包括:
  • 正在處理高優先級別的 FCM 消息;
  • 正在接收例如 SMS/MMS 的消息廣播;
  • 正在從通知處理 PendingIntent 消息;
可是在該時間窗結束後,應用將被視爲處於空閒狀態, 此時系統將中止應用的後臺服務,就像應用已經調用服務的 Service.stopSelf() 方法同樣。
    官方建議多使用 JobScheduler 來處理後臺任務,詳細的適配指南: 後臺執行限制

2.2 安全性

  Android O 包含如下與安全性有關的變動:

  • 再也不支持 SSLv3;
  • 應用的 WebView 對象將在多進程模式下運行。網頁內容在獨立的進程中處理,此進程與包含應用的進程相隔離,以提升安全性;
  • 在與未正確實現 TLS 協議版本協商的服務器創建 HTTPS 鏈接時,HttpsURLConnection 再也不嘗試回退到以前的 TLS 協議版本並重試的權宜方法;
  • Android O 將使用安全計算 (SECCOMP) 過濾器來過濾全部應用。容許的系統調用列表僅限於經過 bionic 公開的系統調用。此外,還提供了其餘幾個後向兼容的系統調用,但咱們不建議使用這些系統調用。

2.3 網絡鏈接和 HTTP(S) 鏈接

  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) 鏈接

2.4 權限

  在 Android O 以前,若是應用在運行時請求權限而且被授予該權限,系統會錯誤地將屬於同一權限組而且在清單中註冊的其餘權限也一塊兒授予應用。對於針對 Android O 的應用,此行爲已被糾正。系統只會授予應用明確請求的權限。然而,一旦用戶爲應用授予某個權限,則全部後續對該權限組中權限的請求都將被自動批准。

2.5 媒體變動

  

  • 使用 AudioTrack 時,若是應用請求了足夠大的音頻緩衝區,則框架將嘗試使用深度緩衝區輸出(若是可用);
  • 音頻流類型應僅用於音量控制;全部其餘流類型的使用(例如 AudioTrack 構造函數)仍有效,但系統會將其做爲錯誤記錄下來;
  • 當用戶打電話時,活動的媒體流將在通話期間靜音;
  • 全部與音頻相關的 API 均使用 AudioAttributes 來描述音頻播放用例;
  • 框架會執行音頻閃避,進行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 時,應用不會失去焦點。新的 API 適用於須要暫停而不是閃避的應用。不過,Android O 中未提供此行爲。

2.6 Native libraries

  在針對 Android O 的應用中,若是 Native libraries 包含任何可寫且可執行的代碼段,則不會再加載 Native libraries,可寫和可執行必須是在新版本必須是互斥的,假若某些應用的 Native libraries 包含不正確的加載代碼段,則此變動可能會致使這些應用中止工做,官方文檔:Writable and Executable Segments

2.7 其餘

  1. ContentProvider 支持分頁,即獲取內容的選中區域的子集;
  2. ContentProvider 和 ContentResolver 增長 refresh 方法,用來讓客戶端更容易的知道數據是否是最新;
  3. JobScheduler 更新,讓應用更容易聽從後臺執行限制;
  4. 集合的處理的變化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始終引起 NullPointerException;
  5. 語言區域和國際化變化
  6. 聯繫人提供程序使用狀況統計方法的變動
  7. 藍牙 ScanRecord.getBytes() 方法檢索的數據長度變動
  8. 輸入和導航

3 Android O 版本 API 變動

3.1 WebView 新 API

  Android O 預覽版本提供了幾個新的 API 用來管理 WebView:

  • Version API
  • 第一個是提供獲取 WebView 版本信息的 API:

PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);複製代碼

  • Google Safe Browsing API
  • 能夠再 Manifest 中配置 enable,而後在 WebView 打開未知不安全 url 的時候提示用戶:

    <manifest>
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
        ...
        <application> ... </application>
    </manifest>複製代碼

  • Termination Handle API
  • WebView 繪製進程被殺或者 Crash 的回調;

  • Renderer Importance API
  • 用來設置 WebView 繪製進程的優先級別,爲了提供應用的穩定性,通常狀況下應用不須要去修改繪製進程優先級,若是須要使用請和 Termination Handle API 一塊兒搭配使用;

    3.2 findViewById

      findViewById 函數如今返回的是 <T extends View>,因此之後 findViewById 就不須要強轉了。

    3.3 統一的 margins 和 padding

      Android 引入了幾個新的 xml 屬性:

    • layout_marginVertical,同時設置 layout_marginToplayout_marginBottom 屬性;
    • layout_marginHorizontal,同時設置 layout_marginLeftlayout_marginRight屬性;
    • paddingVertical,同時設置 paddingToppaddingBottom屬性;
    • paddingHorizontal,同時設置 paddingLeftpaddingRight屬性;

    3.4 AnimationSet

      Android O 中,AnimationSet API 如今支持了動畫的 seek 和動畫倒轉播放,seek 操做能夠設置 AnimationSet 從指定的點開始播放,倒轉播放則將之前須要重複定義兩個相反的動畫操做簡化成只須要定義一個動畫便可。

    3.5 提醒窗口

      在 Android O 版本以前,應用若是不用 type_toast 顯示懸浮窗,通常正常狀況下都會使用聲明 SYSTEM_ALERT_WINDOW 權限 + 使用 TYPE_SYSTEM_ERROR 的形式來顯示懸浮窗,國內的第三方 ROM 也會對此有限制,Android 6.0 版本曾經對懸浮窗有過一次限制,必需要用戶手動開啓「在其餘應用之上顯示」的權限才能展現懸浮窗,在 Android O 以後 SYSTEM_ALERT_WINDOW 權限的應用沒法再使用如下窗口類型來在其餘應用和系統窗口上方顯示提醒窗口:

    • TYPE_PHONE
    • TYPE_PRIORITY_PHONE
    • TYPE_SYSTEM_ALERT
    • TYPE_SYSTEM_OVERLAY
    • TYPE_SYSTEM_ERROR

    相反,應用必須使用名爲 TYPE_APPLICATION_OVERLAY 的新窗口類型,在使用 TYPE_APPLICATION_OVERLAY 窗口類型顯示應用的提醒窗口時,也增長了一下限制:
    • 應用的提醒窗口始終顯示在狀態欄和輸入法等關鍵系統窗口的下面;
    • 系統能夠移動使用 TYPE_APPLICATION_OVERLAY 窗口類型的窗口或調整其大小,以改善屏幕顯示效果;
    • 經過打開通知欄,用戶能夠訪問設置來阻止應用顯示使用 TYPE_APPLICATION_OVERLAY 窗口類型顯示的提醒窗口。
    相關文章
    相關標籤/搜索