原文地址(QQ音樂微信公眾號首發(fā)): https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651232573&idx=1&sn=56963d1ecb1eeea2c82ec88d9667c0b0&chksm=f1d9e45ec6ae6d480b1b8ab73b
1. Android O 新特性
前段時間解決了幾個 QQ 音樂多窗口屏幕顯示的 bug,雖然這個問題最終不是 Android O 版本的問題,多窗口是 Android 7.1 之后引入的(關(guān)于多窗口適配需要注意的地方,可以看看這篇文章:Android Multi-Window詳細(xì)介紹),但是趁此機(jī)會了解一下 Android O 版本的新特性也不錯,而且 Google IO 大會剛剛過去,趁這個熱度介紹一下。
在大會上介紹到的 Android O 新版本更新和優(yōu)化主要集中在兩個方面:Fluid Experiences 和 Vitals,Fluid Experience 主要包含了四個顯著特性:Notification Dots, Picture In Picture, Autofill Framework 和 Smart Text Selection;而 Vitals 主要在電池續(xù)航、安全、啟動時間以及穩(wěn)定性這幾個方面做優(yōu)化。
1.1 通知變更
Android O 版本重新設(shè)計(jì)了通知,讓通知的管理更加方便,首先引入了通知渠道用來讓用戶統(tǒng)一管理通知,當(dāng) targetApi 設(shè)置為 O 版本時,必須要實(shí)現(xiàn)一個或多個通知渠道,如果設(shè)置為 O 版本之前的版本,在 O 版本設(shè)備上的行為則和 7.x 版本保持一致。通知渠道提供了一種將應(yīng)用內(nèi)的通知變成一個個易于管理組的方法,通知渠道創(chuàng)建并提交到 notification manager 后,便無法通過編程方式修改通知渠道的行為,這些設(shè)置之后則由用戶掌控。用戶現(xiàn)在可以使用一致的系統(tǒng) UI 管理大多數(shù)與通知有關(guān)的設(shè)置。所有發(fā)布至同一通知渠道的通知都具有相同的行為。當(dāng)用戶長摁通知或者通過設(shè)置去到通知的設(shè)置頁面的時候,可以看到這些界面:

通過這個設(shè)置頁面可以看到,用戶可以將應(yīng)用所有的通知渠道關(guān)閉,或者關(guān)閉某一個單獨(dú)的通知渠道,每一個通知渠道也有相應(yīng)的行為,用戶可以去自行修改,比如修改通知渠道的優(yōu)先級,如果支持的話,用戶還可以去聲明通知是否同時顯示為應(yīng)用的角標(biāo)。Android O 還引入了通知角標(biāo),當(dāng)一個應(yīng)用的通知沒有 dismiss 的時候,會在應(yīng)用的圖標(biāo)上面顯示一個角標(biāo),長摁這個應(yīng)用的圖標(biāo),也會顯示通知的詳情信息:

O 版本棄用了對單個通知設(shè)置優(yōu)先級的功能,現(xiàn)在是對通知渠道設(shè)置優(yōu)先級,該通知渠道的所有通知都適用于該優(yōu)先級,優(yōu)先級從 IMPORTANCE_NONE(0) 至 IMPORTANCE_HIGH(4),對用戶的提醒等級從小到大。關(guān)于創(chuàng)建通知渠道組,向渠道組發(fā)送通知或者修改通知渠道組設(shè)置的代碼可以查看 Google 文檔:通知渠道。
同時還引入了一個通知睡眠的功能,用戶可以休眠一個通知,讓它在指定的時候再出現(xiàn),被休眠的時候仍然可以修改這個通知的設(shè)置,但是不會讓這個通知立馬出現(xiàn)。另外還可以設(shè)置一個通知的超時時間,用來讓某個通知在一段時間之后被自動 cancel。其他的比如可以獲取通知的清除方式,修改通知的背景顏色,修改通知的樣式可以看官方文檔:Android O-通知。
使用場景:針對應(yīng)用的不同優(yōu)先級別的通知設(shè)置不同的通知渠道,強(qiáng)提醒可以發(fā)出聲音加震動,弱提醒可能僅僅只需要呼吸燈和角標(biāo)這樣等,這樣可以最大程度減少對用戶的干擾。
1.2 畫中畫模式
在 Android O 之前,畫中畫模式已經(jīng)可用于 Android TV,而 Android O 則讓這一個功能可以支持到其他的 Android 設(shè)備,當(dāng)某個 Activity 處于 PIP 模式時,它會回調(diào)生命周期的 onPause 方法,所以此時在 PIP 模式下比如視頻播放等操作就不能夠在 onPause 里面暫停,而應(yīng)該在 onStop 里面,這一點(diǎn)和多窗口模式一樣,來看看它的效果:

我們可以看到在當(dāng)從 youtube 視頻切換出去之后會回到桌面,這時候會有一個視頻播放的窗口懸浮在所有的應(yīng)用之上,這個小窗口在播放視頻,而此時點(diǎn)擊這個小窗口區(qū)域會彈出幾個操作按鈕,可以選擇關(guān)閉,或者是重新打開 youtube 視頻播放頁,而且底部的幾個按鈕也是可以自定義的,非常方便。
這里需要提到的一點(diǎn)是,升級到 8.0 的系統(tǒng)后不是立馬會激活這個功能,激活這個功能可能會有點(diǎn)復(fù)雜:<ul><li>第一步開啟 System UI Tuner 功能,開啟的方式是下拉通知欄,長摁右下角的設(shè)置按鈕,

直到系統(tǒng)提示
System UI Tuner 已開啟;</li><li>第二步去設(shè)置頁面 Settings > System > System UI Tuner > Navigation bar,去到 navigation bar 之后選擇 extra left button type 或者 extra right button type,選擇 keycode,選擇完成之后返回到上一個頁面填寫 right/left keycode 為 171,代表將當(dāng)前顯示頁面變?yōu)?PIP 模式窗口(如果不支持頁面沒有任何反應(yīng)),然后選擇一個 right/left icon:
之后就會在導(dǎo)航欄上出現(xiàn)一個新增的按鈕,這個按鈕就是用來將頁面進(jìn)入 PIP 模式;
</li><li>第三步再返回上一個
System UI Tuner頁面,選擇 Picture-in-Picture 模式,進(jìn)去之后將 Minimize 打開即可。</li></ul>完成上面的操作之后,進(jìn)入支持 PIP 模式的頁面,比如 youtube 的視頻播放頁面,點(diǎn)擊導(dǎo)航欄新增的那個按鈕,頁面就會縮小到一個小窗口播放,如上面的實(shí)例圖片所示。
要指定 Activity 可以使用 PIP 模式,需要在 Manifest文件中將
android:supportsPictureInPicture 設(shè)置為 true,除了上面提到的用戶手動將 Activity 變成 PIP 模式,還可以使用 Activity.enterPictureInPictureMode(PictureInPictureArgs args) 動態(tài)將 Activity 設(shè)置為 PIP 模式, PictureInPictureArgs 這個對象參數(shù)是用來指定 Activity 處于 PIP 模式時的行為,此對象還指定了各種屬性,例如 Activity 的首選縱橫比,同時還可以使用 Activity.setPictureInPictureArgs() 更新 Activity 的 PIP 配置設(shè)置,如果 Activity 目前處于 PIP 模式,則會更新此設(shè)置。使用場景:這個功能就很貼心了,比起以前的 Multi-window,這個更強(qiáng)調(diào)兩個應(yīng)用的主次之分,比較適合的場景可能有視頻播放頁面的最小化,地圖應(yīng)用的最小化等等。針對 QQ 音樂來說可以使用在直播頁面,MV 播放頁面等等。
1.3 自適應(yīng)圖標(biāo)
為了幫助開發(fā)者更好的與設(shè)備 UI 集成,Android O 支持創(chuàng)建自適應(yīng)圖標(biāo),系統(tǒng)可以基于設(shè)備選擇的蒙版將這些圖標(biāo)顯示為不同形狀。系統(tǒng)還將實(shí)現(xiàn)與圖標(biāo)的自動交互,并在啟動器、快捷方式、設(shè)置、共享對話框以及概覽屏幕中使用它們:
可以通過定義兩層圖層(前景和背景)來指定桌面圖標(biāo)外觀,必須提供沒有形狀和陰影的 PNG 格式圖象作為圖層:
在以前的 Android 版本中,圖標(biāo)大小定義為 48 x 48 dp,但是現(xiàn)在必須按照以下的規(guī)范定義圖層大?。?
- 兩張圖層大小都必須為 108 x 108 dp。
- 圖層中心 72 x 72 dp 范圍為可視范圍。
- 系統(tǒng)會保留四周的 18dp 范圍用于生成有趣的視覺效果(如視差和跳動):
創(chuàng)建自適應(yīng)圖標(biāo)可以參考:Create adaptive icons with Android Studio:
這個就將以前混亂的圖標(biāo)統(tǒng)一化了,現(xiàn)在 Android 很多應(yīng)用的圖標(biāo),有的是正方形的,有的帶圓弧,而且這圓弧的弧度各有差異,有的圖標(biāo)還是圓形,有的則是不規(guī)則的圖片,統(tǒng)一之后所有的應(yīng)用圖標(biāo)將具有一致的風(fēng)格,比較推薦。
1.4 自動填充框架
Android O 還引入了自動填充框架,簡化了用戶在賬號創(chuàng)建、登錄和信用卡表單之類的填寫工作,在用戶選擇自動填充框架之后,新老用戶都可以使用自動填充框架,我們使用 Chrome 的時候已經(jīng)體驗(yàn)過了自動填充用戶名和密碼的功能,只不過這次是在系統(tǒng)層面提供了這樣的一種功能,可以快速的填充用戶名,地址甚至密碼等,而且用戶也不需要去擔(dān)心安全問題。
同樣自動填充框架也需要去設(shè)置頁面打開: Settings > Apps & Notifications > Default apps > Autofill app,關(guān)于如何適配自動填充框架:Autofill Framework:

這個場景可以參考 Chrome 的記住賬號和密碼功能,例如現(xiàn)在的 QQ 登錄其實(shí)是已經(jīng)做了一個類似的 Auto-Fill 功能,比較適合用在賬號密碼等場景上。
1.5 xml 字體和可下載字體
Android O 推出了 xml 字體,可以在資源文件中建立 font 字體資源文件夾,放入相應(yīng)的字體 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,可以從另一個應(yīng)用中獲取字體資源,而不是將字體資源打包到 apk 中或者讓 apk 去下載,通過 Android support library 26 版本可以讓這個特性支持到 14 版本或者之上的設(shè)備上,具體的 API 可以看看這個:Downloadable Fonts 或者這個 sample android-DownloadableFonts:
適用場景:這個比較適合在公司的一系列 APP 上使用,更換皮膚同時更換字體等等。
1.6 Pinned Shortcut
這個功能在 7.1.1 之后就已經(jīng)有了,長摁桌面圖標(biāo)就會顯示一個 App shortcuts 菜單欄,然后長摁菜單欄上的一項(xiàng),就能把它拖下來成為單獨(dú)的一個應(yīng)用圖標(biāo),被拖下來的單獨(dú)的應(yīng)用圖標(biāo)就是Pinned shortcuts,雖然這個功能在 7.1.1 引入的,但是在 O 版本我們可以通過提供的 API 按照一定的步驟去使用代碼添加:Pinning Shortcuts and Widgets。
適用場景:這個可以將某些應(yīng)用使用頻繁的小功能獨(dú)立出來,比如 QQ 的最常用聯(lián)系人,音樂的聽歌識曲等功能。
1.7 TextView 字體自動適配
Android O 版本允許設(shè)置 TextView 的字體大小根據(jù)設(shè)置的初始大小自動放大或者縮小,這樣就可以讓字體的顯示在不同的屏幕和不同的顯示內(nèi)容上達(dá)到最優(yōu)的效果,而且使用 Android support library 26 中的 android.support.v4.widget.TextViewCompat 可以讓該特性支持到 14 版本,Android O 版本的 TextView 已經(jīng)可以支持 autosize 了,設(shè)置 autosize 特性也非常簡單,在 O 版本上,只需要使用 setAutoSizeTextTypeWithDefaults(@AutoSizeTextType int autoSizeTextType) 或者
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeTextType="uniform"
/>
就可以了,關(guān)于使用的細(xì)節(jié):Autosizing TextViews。
適用場景:TextView 顯示內(nèi)容較多的時候,如果可以接受的話,適當(dāng)?shù)臏p小字體的大小,讓顯示的字?jǐn)?shù)增加。
1.8 媒體增強(qiáng)
Android O 版本新增 VolumeShaper 類,用來為應(yīng)用提供聲音的淡入淡出等音效;新增AudioFocusRequest 類用來提供檢測音頻焦點(diǎn)的新功能;新增了以下的方法 getMetrics 方法用來返回一個包含配置和性能信息的 Bundle 對象:<ul><li>MediaPlayer.getMetrics()</li><li>MediaRecorder.getMetrics()</li><li>MediaCodec.getMetrics()</li><li>MediaExtractor.getMetrics()</li></ul>
MediaPlayer 新增了一些新的方法,這些方法可以用來增強(qiáng)應(yīng)用處理媒體播放的能力:<ul><li>通過控制緩沖行為改進(jìn)性能的功能;</li><li>在搜索幀時進(jìn)行精細(xì)控制;</li><li>播放受數(shù)字版權(quán)管理保護(hù)的材料的功能(和 MediaDrm 類功能類似,但是不同的是這個不會暴露底層的提取器,版權(quán)和加密數(shù)據(jù):DRM support)。</li></ul>
音頻錄制器 MediaRecorder 現(xiàn)在支持對流式傳輸有用的 MPEG2_TS 格式,MediaMuxer 現(xiàn)在可以處理任意數(shù)量的音頻和視頻流,而不再僅限于一個音頻曲目和/或一個視頻曲目。使用 addTrack() 可混錄所需的任意數(shù)量的曲目,MediaMuxer 還可以添加一個或多個包含用戶定義的每幀信息的元數(shù)據(jù)曲目。元數(shù)據(jù)的格式由應(yīng)用定義。僅對 MP4 容器支持元數(shù)據(jù)曲目。
1.8.1 音頻播放設(shè)置
Android O 允許應(yīng)用查詢和獲取設(shè)備如何發(fā)出聲音,應(yīng)用可以通過 requestAudioFocus()函數(shù)來為設(shè)備范圍的音頻焦點(diǎn)提交一個細(xì)粒度的請求,比如傳入一個 AudioFocusRequest 對象,設(shè)置對應(yīng)的 type,就可以指定獲取焦點(diǎn)的類型,同時可以設(shè)置當(dāng)音頻焦點(diǎn)被強(qiáng)占時候應(yīng)用的行為,輕聲繼續(xù)播放還是徹底暫停。
1.8.2 LDAC 音質(zhì)增強(qiáng)
值得一提的是,在 Android O 上引入了 sony “捐贈”的 LDAC 無線聲音加密格式,用來進(jìn)行高質(zhì)量音樂的藍(lán)牙通信,這樣就可以通過藍(lán)牙耳機(jī)播放真正的無損音樂了:

可以看到使用了 LDAC 無線聲音加密協(xié)議之后,最高可以達(dá)到 990kbps 的傳輸速率,好消息是不是!但是可惜的是 LDAC 只能再 sony 制造的耳機(jī)上使用,比如 £330 MDR-1000X,高呼Sony大法好~~
1.9 其他特性
1. 可以設(shè)置 Activity 支持廣色域;
2. 可以設(shè)置最大的屏幕寬高比;
3. 多屏幕支持,支持設(shè)備外接一個顯示器;
4. 最新版本 emoji 支持,使用 EmojiCompat 類可以讓應(yīng)用在老版本的應(yīng)用上顯示新的 emoji;
5. 支持點(diǎn)擊位置的捕捉;
6. 支持設(shè)置應(yīng)用類別,這些類別用于將應(yīng)用呈現(xiàn)給用戶的用途或功能相同的應(yīng)用歸類在一起,例如按流量消耗、電池消耗和存儲消耗將應(yīng)用歸類。
7. Smart Text Selection,這個功能有人可能在今年老羅的錘子手機(jī)發(fā)布會上看到過,思想是很類似的,復(fù)制一段數(shù)字,就會出現(xiàn)直接撥打電話的選項(xiàng),復(fù)制一段地址就會彈出進(jìn)入地圖的選項(xiàng),地圖 APP 可以一下這個地方能否成為一個很方便入口。
2 Android O 版本行為變更
這個列舉了當(dāng)前可能會影響應(yīng)用的幾個行為變更。
2.1 后臺執(zhí)行限制
Android O 在當(dāng)進(jìn)程進(jìn)入已緩存狀態(tài)時,如果沒有活動的組件,系統(tǒng)將解除應(yīng)用具有的所有喚醒鎖(已緩存狀態(tài)指的是沒有前臺 Activity 或者正在執(zhí)行的前臺 Service)。同時 Android O 上運(yùn)行在后臺的應(yīng)用將會有限制的使用后臺的 Service,并且應(yīng)用也不能在 Manifest 中注冊一些不必要的隱式廣播用來進(jìn)行自啟等操作:<ul><li>在后臺運(yùn)行的應(yīng)用對后臺服務(wù)的訪問受到限制;</li><li>應(yīng)用無法使用其清單注冊大部分隱式廣播(即并非專門針對此應(yīng)用的廣播,比如 ACTION_PACKAGE_REPLACED 針對所有應(yīng)用是一個隱式廣播,而ACTION_MY_PACKAGE_REPLACED只針對本應(yīng)用就不是一個隱式廣播)。</li></ul>上面的限制針對 targetApi 為 O 和之上的應(yīng)用生效,但是用戶可以在設(shè)置頁面設(shè)置讓這個限制對所有 targetApi 的應(yīng)用生效。
處于前臺時,應(yīng)用可以自由創(chuàng)建和運(yùn)行前臺服務(wù)與后臺服務(wù)。 進(jìn)入后臺時,在某些情況下,在一個持續(xù)數(shù)分鐘的時間窗內(nèi),應(yīng)用仍可以創(chuàng)建和使用服務(wù),這些情況包括:<ul><li>正在處理高優(yōu)先級別的 FCM 消息;</li><li>正在接收例如 SMS/MMS 的消息廣播;</li><li>正在從通知處理 PendingIntent 消息;</li></ul>但是在該時間窗結(jié)束后,應(yīng)用將被視為處于空閑狀態(tài), 此時系統(tǒng)將停止應(yīng)用的后臺服務(wù),就像應(yīng)用已經(jīng)調(diào)用服務(wù)的 Service.stopSelf() 方法一樣。
官方建議多使用 JobScheduler 來處理后臺任務(wù),詳細(xì)的適配指南:后臺執(zhí)行限制。
2.2 安全性
Android O 包含以下與安全性有關(guān)的變更:<ul><li>不再支持 SSLv3;</li><li>應(yīng)用的 WebView 對象將在多進(jìn)程模式下運(yùn)行。網(wǎng)頁內(nèi)容在獨(dú)立的進(jìn)程中處理,此進(jìn)程與包含應(yīng)用的進(jìn)程相隔離,以提高安全性;</li><li>在與未正確實(shí)現(xiàn) TLS 協(xié)議版本協(xié)商的服務(wù)器建立 HTTPS 連接時,HttpsURLConnection 不再嘗試回退到之前的 TLS 協(xié)議版本并重試的權(quán)宜方法;</li><li>Android O 將使用安全計(jì)算 (SECCOMP) 過濾器來過濾所有應(yīng)用。允許的系統(tǒng)調(diào)用列表僅限于通過 bionic 公開的系統(tǒng)調(diào)用。此外,還提供了其他幾個后向兼容的系統(tǒng)調(diào)用,但我們不建議使用這些系統(tǒng)調(diào)用。</li></ul>
2.3 網(wǎng)絡(luò)連接和 HTTP(S) 連接
Android O 對網(wǎng)絡(luò)連接和 HTTP(S) 連接行為做出了不少變更,其中包括無正文的 OPTIONS 請求現(xiàn)在有 Content-Length: 0 標(biāo)頭;HttpURLConnection 在包含斜線的主機(jī)或頒發(fā)機(jī)構(gòu)名稱后面附加一條斜線,將 http://example.com 轉(zhuǎn)化為 http://example.com/ ;通過 ProxySelector.setDefault() 設(shè)置的自定義代理選擇器的范圍變化;URI 不能包含空白標(biāo)簽;如果之前執(zhí)行的 connect() 方法失敗,send(java.net.DatagramPacket) 方法將會引發(fā) SocketException;在回退到 TCP Echo 協(xié)議之前,InetAddress.isReachable() 會嘗試執(zhí)行 ICMP;隧道 HTTP(S) 連接處理進(jìn)行了一些變更。
變更內(nèi)容比較繁多:網(wǎng)絡(luò)連接和 HTTP(S) 連接。
2.4 權(quán)限
在 Android O 之前,如果應(yīng)用在運(yùn)行時請求權(quán)限并且被授予該權(quán)限,系統(tǒng)會錯誤地將屬于同一權(quán)限組并且在清單中注冊的其他權(quán)限也一起授予應(yīng)用。對于針對 Android O 的應(yīng)用,此行為已被糾正。系統(tǒng)只會授予應(yīng)用明確請求的權(quán)限。然而,一旦用戶為應(yīng)用授予某個權(quán)限,則所有后續(xù)對該權(quán)限組中權(quán)限的請求都將被自動批準(zhǔn)。
2.5 媒體變更
<ul><li>使用 AudioTrack 時,如果應(yīng)用請求了足夠大的音頻緩沖區(qū),則框架將嘗試使用深度緩沖區(qū)輸出(如果可用);</li><li>音頻流類型應(yīng)僅用于音量控制;所有其他流類型的使用(例如 AudioTrack 構(gòu)造函數(shù))仍有效,但系統(tǒng)會將其作為錯誤記錄下來;</li><li>當(dāng)用戶打電話時,活動的媒體流將在通話期間靜音;</li><li>所有與音頻相關(guān)的 API 均使用 AudioAttributes 來描述音頻播放用例;</li><li>框架會執(zhí)行音頻閃避,進(jìn)行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 時,應(yīng)用不會失去焦點(diǎn)。新的 API 適用于需要暫停而不是閃避的應(yīng)用。不過,Android O 中未提供此行為。</li></ul>
2.6 Native libraries
在針對 Android O 的應(yīng)用中,如果 Native libraries 包含任何可寫且可執(zhí)行的代碼段,則不會再加載 Native libraries,可寫和可執(zhí)行必須是在新版本必須是互斥的,倘若某些應(yīng)用的 Native libraries 包含不正確的加載代碼段,則此變更可能會導(dǎo)致這些應(yīng)用停止工作,官方文檔:Writable and Executable Segments。
2.7 其他
1. ContentProvider 支持分頁,即獲取內(nèi)容的選中區(qū)域的子集;
2. ContentProvider 和 ContentResolver 增加 refresh 方法,用來讓客戶端更容易的知道數(shù)據(jù)是不是最新;
3. JobScheduler 更新,讓應(yīng)用更容易遵從后臺執(zhí)行限制;
4. 集合的處理的變化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始終引發(fā) NullPointerException;
5. 語言區(qū)域和國際化變化;
6. 聯(lián)系人提供程序使用情況統(tǒng)計(jì)方法的變更;
7. 藍(lán)牙 ScanRecord.getBytes() 方法檢索的數(shù)據(jù)長度變更;
8. 輸入和導(dǎo)航;
3 Android O 版本 API 變更
3.1 WebView 新 API
Android O 預(yù)覽版本提供了幾個新的 API 用來管理 WebView:<ul><li>Version API</li>第一個是提供獲取 WebView 版本信息的 API:
PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);
<li>Google Safe Browsing API</li>可以再 Manifest 中配置 enable,然后在 WebView 打開未知不安全 url 的時候提示用戶:
<manifest>
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
...
<application> ... </application>
</manifest>
<li>Termination Handle API</li>WebView 繪制進(jìn)程被殺或者 Crash 的回調(diào);
<li>Renderer Importance API</li>用來設(shè)置 WebView 繪制進(jìn)程的優(yōu)先級別,為了提供應(yīng)用的穩(wěn)定性,一般情況下應(yīng)用不需要去修改繪制進(jìn)程優(yōu)先級,如果需要使用請和 Termination Handle API 一起搭配使用;</ul>
3.2 findViewById
findViewById 函數(shù)現(xiàn)在返回的是 <T extends View>,所以以后 findViewById 就不需要強(qiáng)轉(zhuǎn)了。
3.3 統(tǒng)一的 margins 和 padding
Android 引入了幾個新的 xml 屬性:
<ul><li>layout_marginVertical,同時設(shè)置 layout_marginTop 和 layout_marginTop 屬性;</li><li>layout_marginHorizontal,同時設(shè)置 layout_marginLeft 和 layout_marginRight屬性;</li><li>paddingVertical,同時設(shè)置 paddingTop 和 paddingBottom屬性;</li><li>paddingHorizontal,同時設(shè)置 paddingLeft 和 paddingRight屬性;</li></ul>
3.4 AnimationSet
Android O 中,AnimationSet API 現(xiàn)在支持了動畫的 seek 和動畫倒轉(zhuǎn)播放,seek 操作可以設(shè)置 AnimationSet 從指定的點(diǎn)開始播放,倒轉(zhuǎn)播放則將以前需要重復(fù)定義兩個相反的動畫操作簡化成只需要定義一個動畫即可。
3.5 提醒窗口
在 Android O 版本之前,應(yīng)用如果不用 type_toast 顯示懸浮窗,一般正常情況下都會使用聲明 SYSTEM_ALERT_WINDOW 權(quán)限 + 使用 TYPE_SYSTEM_ERROR 的形式來顯示懸浮窗,國內(nèi)的第三方 ROM 也會對此有限制,Android 6.0 版本曾經(jīng)對懸浮窗有過一次限制,必須要用戶手動開啟“在其他應(yīng)用之上顯示”的權(quán)限才能展示懸浮窗,在 Android O 之后 SYSTEM_ALERT_WINDOW 權(quán)限的應(yīng)用無法再使用以下窗口類型來在其他應(yīng)用和系統(tǒng)窗口上方顯示提醒窗口:<ul><li>TYPE_PHONE</li><li>TYPE_PRIORITY_PHONE</li><li>TYPE_SYSTEM_ALERT</li><li>TYPE_SYSTEM_OVERLAY</li><li>TYPE_SYSTEM_ERROR</li></ul>
相反,應(yīng)用必須使用名為 TYPE_APPLICATION_OVERLAY 的新窗口類型,在使用 TYPE_APPLICATION_OVERLAY 窗口類型顯示應(yīng)用的提醒窗口時,也增加了一下限制:<ul><li>應(yīng)用的提醒窗口始終顯示在狀態(tài)欄和輸入法等關(guān)鍵系統(tǒng)窗口的下面;</li><li>系統(tǒng)可以移動使用 TYPE_APPLICATION_OVERLAY 窗口類型的窗口或調(diào)整其大小,以改善屏幕顯示效果;</li><li>通過打開通知欄,用戶可以訪問設(shè)置來阻止應(yīng)用顯示使用 TYPE_APPLICATION_OVERLAY 窗口類型顯示的提醒窗口。</li></ul>