前言
基于上篇文章Android 5.0之后的各版本與日常開發(fā)相關(guān)的內(nèi)容整理,本篇文章對Android 7.0、8.0、9.0做個(gè)簡述。
內(nèi)容如下:
Android 7.0(N)
1.多窗口支持(分屏模式)
2.桌面長按圖標(biāo)出現(xiàn)快捷方式
Android 8.0(O)
1.畫中畫模式(PIP,其實(shí)就像是分屏模式的優(yōu)化版)
2.自定義字體,可下載字體(AS 3.x以上可以找到,但沒有中文字體可下載)。
3.自動(dòng)縮放文本視圖(Autosizing TextView)
Android 9.0(P)
1.劉海屏適配。
2.ImageDecoder 和 AnimagedImageDrawable。
Android 7.0
1、多窗口支持(分屏模式)
Android N允許用戶一次在屏幕中使用兩個(gè)App。
知識(shí)點(diǎn)
1、禁用分屏模式。
App默認(rèn)允許分屏模式,如果要禁用分屏模式,可以在AndroidManifest.xml的application節(jié)點(diǎn)添加屬性android:resizeableActivity="false",表示應(yīng)用頁面不接受分屏,這樣有的手機(jī)就沒有顯示分屏按鈕了,或者即使用戶開啟了分屏模式,切換到該應(yīng)用時(shí)仍會(huì)強(qiáng)制回到全屏模式。
2、全屏->分屏->全屏的生命周期如何變化?
App頁面從全屏模式切換到分屏模式,它的Activity生命周期會(huì)經(jīng)歷銷毀后重建的過程,如果不希望重建,可以在該頁面設(shè)置android:configChanges="orientation|screenLayout|screenSize"。(不設(shè)置screenSize也可能會(huì)成功)
舉例A、B兩個(gè)app。
1)appA,全屏->分屏:
onPause() -> onStop() -> onMultiWindowModeChanged() ->onStart() ->onResume() ->onPause()。
2)此時(shí)要選擇appB分屏,當(dāng)點(diǎn)擊appA時(shí),appA才會(huì)調(diào)用onResume。
3)appA,分屏->全屏,此時(shí)只會(huì)回調(diào) onMultiWindowModeChanged()。
3、isInMultiWindowMode()可得知當(dāng)前是否處于分屏模式;onMultiWindowModeChanged方法是每次切換進(jìn)出分屏模式都會(huì)回調(diào)的。
4、視頻播放頁面,建議不在onPause方法中暫停播放視頻,而應(yīng)當(dāng)在onStop方法中暫停播放,并在onStart方法中恢復(fù)播放視頻。
總結(jié)
分屏主要影響的是視頻播放頁面,需要在視頻播放頁設(shè)置分配不重建,且把視頻播放暫停邏輯移到onStop()和onStart()中。實(shí)際上分屏使用情況率不太多,也可以禁止它分屏。
參考
Android編程開發(fā)技巧之Android7.0的分屏模式
2、桌面長按圖標(biāo)出現(xiàn)快捷方式
桌面長按圖標(biāo)出現(xiàn)快捷方式條目,可以拖動(dòng)到桌面,放置成一個(gè)單獨(dú)固定的桌面快捷方式,具體效果可以看支付寶和微博。它分為靜態(tài)配置和動(dòng)態(tài)配置
靜態(tài)配置
1)在res文件夾下創(chuàng)建xml目錄,并在xml目錄下創(chuàng)建配置文件 shortcuts.xml。
2.)在Manifest中添加meta-data配置。只在app啟動(dòng)的第一個(gè)頁面添加配置才有效。
//關(guān)鍵代碼
//1.shortcuts.xml
//shortcutLongLabel 就是長按顯示的條目
//shortcutShortLabel 就是拖動(dòng)到桌面顯示的文字
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="v5_6_function"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/short_label_5"
android:shortcutLongLabel="@string/long_label_5"
android:shortcutDisabledMessage="@string/disable_msg_5">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.sz.dzh.dviewsummary"
android:targetClass="com.sz.dzh.dviewsummary.module.v5_6_function.V5FunctionListActivity" />
</shortcut>
</shortcuts>
//2.在AndroidManifest.xml 中 app啟動(dòng)的第一個(gè)Activity里添加配置
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
動(dòng)態(tài)配置
由ShortcutManager發(fā)布, 可以根據(jù)用戶的行為或者偏好添加, 動(dòng)態(tài)更新。
參考
Android 7.0新特性——桌面長按圖標(biāo)出現(xiàn)快捷方式
Android 8.0
1、畫中畫(PIP模式)
Android 7.0推出了分屏模式,8.0推出了新的多窗口模式——“Picture in Picture”(簡稱PIP,“畫中畫”)和分屏模式一樣,適合用于視頻播放,用戶體驗(yàn)上更佳。
知識(shí)點(diǎn)
1、開啟PIP模式
和分屏模式不一樣,Activity默認(rèn)不支持PIP模式,如果要開啟,需要在Activity設(shè)置
android:supportsPictureInPicture="true"。
2、和分屏模式一樣,Activity不重建,可以設(shè)置android:configChanges="orientation|screenLayout|screenSize"。此時(shí)點(diǎn)擊進(jìn)入PIP模式,會(huì)調(diào)用onPause()和onPictureInPictureModeChanged()。
3、isInPictureInPictureMode()可得知當(dāng)前是否處于PIP模式;onPictureInPictureModeChanged方法是每次切換進(jìn)出PIP模式都會(huì)回調(diào)的。
4、PIP模式進(jìn)入需在代碼里設(shè)置,enterPictureInPictureMode()方法。
總結(jié)
PIP模式主要影響的是視頻播放頁面,需要在視頻播放頁設(shè)置分配不重建,且把視頻播放暫停邏輯移到onStop()和onStart()中,它的用戶體驗(yàn)比分屏模式好很多。
2、自定義字體及可下載字體
在Android 8.0之前,要在視圖上使用自定義字體必須進(jìn)行以下操作。
1)將字體文件放到 assets 文件夾。
2)從 asset 文件將字體加載為 Typeface 對象
3)用 TextView.setTypeface() 設(shè)置視圖的 Typeface。
Typeface tf =Typeface.createFromAsset(getAssets(), "fonts/sxslst.ttf");
tvOld.setTypeface(tf);
Android 8 推出了字體資源的新特性,提供了可下載字體,不直接與APK一同打包,而是在第一次使用的時(shí)候才去請求,下載和使用方式如下:
1)在Layout Editor中,選擇一個(gè)TextView,然后在Attributes窗口中, 選擇fontFamily > More Fonts,出現(xiàn)了字體Resources窗口。
2)選擇要下載的字體,然后會(huì)在res\fonts 文件夾下創(chuàng)建這個(gè)字體的xml,在TextView中添加android:fontFamily="@font/akronim"即可使用了。
3)LayoutInflater和資源搜索是同步任務(wù)。默認(rèn)情況下,首次嘗試檢索字體會(huì)觸發(fā)對提供字體的應(yīng)用程序的請求,從而增加了第一個(gè)布局繪制時(shí)間,為了避免延遲,可以在Manifest中預(yù)先聲明需要檢索的字體。如果要替換全局字體,可以在theme下設(shè)置 fontFamily。
AS的字體選擇頁面

總結(jié)
Google提供的可下載字體都是對中文不生效的,這功能對國內(nèi)開發(fā)者來說沒啥用處,要改變字體還是得用回以前的方式。
參考
Android 8.0 新特性(一) - 可下載字體
Android 自定義和可下載字體
3、Autosizing TextView
自動(dòng)調(diào)整文本大小的TextView,當(dāng)TextView的布局邊界尺寸發(fā)生變化時(shí),文本大小可以跟著自動(dòng)縮放調(diào)整。文本的自動(dòng)縮放支持兩種模式,粒度型和預(yù)置大小型。
粒度型:沒有設(shè)置autoSizePresetSizes,那么會(huì)按縮放步長進(jìn)行每一次得縮放。
預(yù)置大小型:文字的大小按預(yù)置變大,比如可以12sp直接到50sp。
| 屬性 | 作用 |
|---|---|
| autoSizeTextType | none(默認(rèn),表示不自動(dòng)縮放)、uniform(橫、縱縮放) |
| autoSizeMinTextSize | 最小尺寸 |
| autoSizeMaxTextSize | 最大尺寸 |
| autoSizeStepGranularity | 變化粒度的步長,粒度型 |
| autoSizePresetSizes | 指定預(yù)置大小序列,為array數(shù)組,預(yù)置大小型 |
參考
Android O —— Autosizing TextViews 自動(dòng)調(diào)整文本大小的TextView
Android 9.0
1、劉海屏適配
Google將劉海屏命名為屏幕缺口,Android P 支持最新的全面屏以及為攝像頭和揚(yáng)聲器預(yù)留空間的凹口屏幕,它提供的適配方案如下:
1)對于有狀態(tài)欄的頁面,不會(huì)受到劉海屏特性的影響,因?yàn)閯⒑F涟跔顟B(tài)欄中了。
2)全屏顯示的頁面,系統(tǒng)劉海屏方案會(huì)對應(yīng)用界面做下移處理,避開劉海區(qū)顯示,這時(shí)會(huì)看到劉海區(qū)域變成一條黑邊;
3)已經(jīng)適配Android P應(yīng)用的全屏頁面可以通過谷歌提供的適配方案使用劉海區(qū),真正做到全屏顯示。
可見,其實(shí)如果能接受劉海那一塊有黑邊,不作操作也行,如果一些頁面圖片要置頂?shù)綘顟B(tài)欄,這時(shí)候就要做全屏適配了。
針對頁面是全屏顯示的情況
1、不適配的話將會(huì)留出一條黑色邊。
2、要做到真正全屏的話,那么就先要獲取到劉海的區(qū)域(危險(xiǎn)區(qū)域),內(nèi)容部分(操作按鈕等)應(yīng)當(dāng)避開危險(xiǎn)區(qū)域,保證在安全區(qū)域中展示。橫屏的話兩邊都需要注意避開劉海(危險(xiǎn)區(qū)域)。
各廠商劉海屏適配
上述的適配是Android 9.0才有的解決方案,在這之前,要用各個(gè)廠商的自己的劉海屏適配。
2、ImageDecoder 和 AnimagedImageDrawable
ImageDecoder,該類除了支持對各種圖片格式的解碼、縮放、裁剪之外,其強(qiáng)大之處在于支持對解碼后的圖像做后期處理(post-process),使用該功能可以添加復(fù)雜的自定義特效,比如圓角,或是將圖片放在圓形像框中。編寫后期處理回調(diào)函數(shù),你可以添加任何繪圖指令實(shí)現(xiàn)需要的效果。
AnimagedImageDrawable,支持GIF和WebP格式的動(dòng)圖,并被新增的解碼器類ImageDecoder直接支持,用法跟矢量動(dòng)畫類AnimatedVectorDrawable類似,實(shí)現(xiàn)方式也類似,通過新增渲染線程和工作線程,不需要在UI線程處理動(dòng)圖更新。
參考
Android P圖像媒體后期處理
android P ImageDecoder 使用
Github地址:DViewSummary