Android 8 更新內(nèi)容(開發(fā)必讀)

Android 8.0 功能和 API

API 級(jí)別:27
Android 8.0 為用戶和開發(fā)者引入多種新功能厢绝。本文重點(diǎn)介紹面向開發(fā)者的新功能坊夫。

請(qǐng)務(wù)必查閱 Android 8.0 行為變更以了解平臺(tái)變更可能影響您的應(yīng)用的領(lǐng)域撕氧。

用戶體驗(yàn)

通知

在 Android 8.0 中,我們已重新設(shè)計(jì)通知翠语,以便為管理通知行為和設(shè)置提供更輕松和更統(tǒng)一的方式的止。這些變更包括:

用戶可以長(zhǎng)按應(yīng)用啟動(dòng)器圖標(biāo)以查看 Android 8.0 中的通知。

  • 通知渠道:Android 8.0 引入了通知渠道骗污,其允許您為要顯示的每種通知類型創(chuàng)建用戶可自定義的渠道崇猫。用戶界面將通知渠道稱之為通知類別。要了解如何實(shí)現(xiàn)通知渠道的信息需忿,請(qǐng)參閱通知渠道指南诅炉。
  • 通知標(biāo)志:Android 8.0 引入了對(duì)在應(yīng)用啟動(dòng)器圖標(biāo)上顯示通知標(biāo)志的支持。通知標(biāo)志可反映某個(gè)應(yīng)用是否存在與其關(guān)聯(lián)屋厘、并且用戶尚未予以清除也未對(duì)其采取行動(dòng)的通知涕烧。通知標(biāo)志也稱為通知點(diǎn)。要了解如何調(diào)整通知標(biāo)志汗洒,請(qǐng)參閱通知標(biāo)志指南议纯。
  • 休眠:用戶可以將通知置于休眠狀態(tài),以便稍后重新顯示它溢谤。重新顯示時(shí)通知的重要程度與首次顯示時(shí)相同瞻凤。應(yīng)用可以移除或更新已休眠的通知憨攒,但更新休眠的通知并不會(huì)使其重新顯示。
  • 通知超時(shí):現(xiàn)在阀参,使用 [setTimeoutAfter()](https://developer.android.com/reference/android/app/Notification.Builder#setTimeoutAfter(long)) 創(chuàng)建通知時(shí)您可以設(shè)置超時(shí)浓恶。您可以使用此函數(shù)指定一個(gè)持續(xù)時(shí)間,超過(guò)該持續(xù)時(shí)間后结笨,通知應(yīng)取消包晰。如果需要,您可以在指定的超時(shí)持續(xù)時(shí)間之前取消通知炕吸。
  • 通知設(shè)置:當(dāng)您使用 [Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES](https://developer.android.com/reference/android/app/Notification#INTENT_CATEGORY_NOTIFICATION_PREFERENCES)Intent 從通知?jiǎng)?chuàng)建指向應(yīng)用通知設(shè)置的鏈接時(shí)伐憾,您可以調(diào)用 setSettingsText() 來(lái)設(shè)置要顯示的文本。此系統(tǒng)可以提供以下 Extra 數(shù)據(jù)和 Intent赫模,用于過(guò)濾應(yīng)用必須向用戶顯示的設(shè)置:EXTRA_CHANNEL_ID树肃、NOTIFICATION_TAGNOTIFICATION_ID
  • 通知清除:系統(tǒng)現(xiàn)在可區(qū)分通知是由用戶清除瀑罗,還是由應(yīng)用移除胸嘴。要查看清除通知的方式,您應(yīng)實(shí)現(xiàn) [NotificationListenerService](https://developer.android.com/reference/android/service/notification/NotificationListenerService) 類的新 [onNotificationRemoved()](https://developer.android.com/reference/android/service/notification/NotificationListenerService#onNotificationRemoved(android.service.notification.StatusBarNotification,%20android.service.notification.NotificationListenerService.RankingMap,%20int)) 函數(shù)斩祭。
  • 背景顏色:您現(xiàn)在可以設(shè)置和啟用通知的背景顏色劣像。只能在用戶必須一眼就能看到的持續(xù)任務(wù)的通知中使用此功能。例如摧玫,您可以為與駕車路線或正在進(jìn)行的通話有關(guān)的通知設(shè)置背景顏色耳奕。您還可以使用 [Notification.Builder.setColor()](https://developer.android.com/reference/android/app/Notification.Builder#setColor(int)) 設(shè)置所需的背景顏色。這樣做將允許您使用 [Notification.Builder.setColorized()](https://developer.android.com/reference/android/app/Notification.Builder#setColorized(boolean)) 啟用通知的背景顏色設(shè)置诬像。
  • 消息樣式:現(xiàn)在屋群,使用 [MessagingStyle](https://developer.android.com/reference/android/app/Notification.MessagingStyle) 類的通知可在其折疊形式中顯示更多內(nèi)容。對(duì)于與消息有關(guān)的通知坏挠,您應(yīng)使用 [MessagingStyle](https://developer.android.com/reference/android/app/Notification.MessagingStyle) 類芍躏。您還可以使用新的 [addHistoricMessage()](https://developer.android.com/reference/android/app/Notification.MessagingStyle#addHistoricMessage(android.app.Notification.MessagingStyle.Message)) 函數(shù),通過(guò)向與消息相關(guān)的通知添加歷史消息為會(huì)話提供上下文降狠。

自動(dòng)填充框架

帳號(hào)創(chuàng)建对竣、登錄和信用卡交易需要時(shí)間并且容易出錯(cuò)。在使用要求執(zhí)行此類重復(fù)性任務(wù)的應(yīng)用時(shí)喊熟,用戶很容易遭受挫折柏肪。

Android 8.0 通過(guò)引入自動(dòng)填充框架姐刁,簡(jiǎn)化了登錄和信用卡表單之類表單的填寫工作芥牌。在用戶選擇接受自動(dòng)填充之后,新老應(yīng)用都可使用自動(dòng)填充框架聂使。

您可以采取某些措施壁拉,優(yōu)化您的應(yīng)用使用此框架的方式谬俄。如需了解詳細(xì)信息,請(qǐng)參閱自動(dòng)填充框架概覽弃理。

畫中畫模式

Android 8.0 允許以畫中畫 (PIP) 模式啟動(dòng)操作組件溃论。PIP 是一種特殊的多窗口模式,最常用于視頻播放痘昌。目前钥勋,PIP 模式可用于 Android TV,而 Android 8.0 則讓該功能可進(jìn)一步用于其他 Android 設(shè)備辆苔。

當(dāng)某個(gè) Activity 處于 PIP 模式時(shí)算灸,它會(huì)處于暫停狀態(tài),但仍應(yīng)繼續(xù)顯示內(nèi)容驻啤。因此菲驴,您應(yīng)確保您的應(yīng)用在 [onPause()](https://developer.android.com/reference/android/app/Activity#onPause()) 處理程序中進(jìn)行處理時(shí)不會(huì)暫停播放。相反骑冗,您應(yīng)在 [onStop()](https://developer.android.com/reference/android/app/Activity#onStop()) 中暫停播放視頻赊瞬,并在 [onStart()](https://developer.android.com/reference/android/app/Activity#onStart()) 中繼續(xù)播放。如需了解詳細(xì)信息贼涩,請(qǐng)參閱多窗口生命周期巧涧。

要指定您的 Activity 可以使用 PIP 模式,請(qǐng)?jiān)谇鍐沃袑?android:supportsPictureInPicture 設(shè)置為 true遥倦。(從 Android 8.0 開始褒侧,如果您打算在 Android TV 或其他 Android 設(shè)備上支持 PIP 模式,則無(wú)需將 android:resizeableActivity 設(shè)置為 true谊迄;只有在您的 Activity 支持其他多窗口模式時(shí)闷供,才需要設(shè)置 android:resizeableActivity。)

API 變更

Android 8.0 引入一種新的對(duì)象 [PictureInPictureParams](https://developer.android.com/reference/android/app/PictureInPictureParams)统诺,您可以將該對(duì)象傳遞給 PIP 函數(shù)來(lái)指定某個(gè) Activity 在其處于 PIP 模式時(shí)的行為歪脏。此對(duì)象還指定了各種屬性,例如操作組件的首選縱橫比粮呢。

現(xiàn)在婿失,在添加畫中畫中介紹的現(xiàn)有 PIP 函數(shù)可用于所有 Android 設(shè)備,而不僅限于 Android TV啄寡。此外豪硅,Android 8.0 還提供以下函數(shù)來(lái)支持 PIP 模式:

  • [Activity.enterPictureInPictureMode(PictureInPictureParams args)](https://developer.android.com/reference/android/app/Activity#enterPictureInPictureMode(android.app.PictureInPictureParams)):將操作組件置于畫中畫模式。操作組件的縱橫比和其他配置設(shè)置均由 args指定挺物。如果 args 中的任何字段為空懒浮,系統(tǒng)將使用您上次調(diào)用 [Activity.setPictureInPictureParams()](https://developer.android.com/reference/android/app/Activity#setPictureInPictureParams(android.app.PictureInPictureParams)) 時(shí)所設(shè)置的值。

    指定的操作組件被置于屏幕的一角,屏幕剩余部分則被屏幕顯示的上一個(gè)操作組件填滿砚著。進(jìn)入 PIP 模式的 Activity 將進(jìn)入暫停狀態(tài)次伶,但仍保持已啟動(dòng)狀態(tài)。如果用戶點(diǎn)按此 PIP 操作組件稽穆,系統(tǒng)將顯示一個(gè)菜單供用戶操作冠王,而在操作組件處于 PIP 狀態(tài)期間,不會(huì)理會(huì)任何觸摸事件舌镶。

  • [Activity.setPictureInPictureParams()](https://developer.android.com/reference/android/app/Activity#setPictureInPictureParams(android.app.PictureInPictureParams)):更新操作組件的 PIP 配置設(shè)置柱彻。如果操作組件目前處于 PIP 模式,則會(huì)更新此設(shè)置餐胀;如果操作組件的縱橫比發(fā)生變化绒疗,這非常有用。如果操作組件不處于 PIP 模式骂澄,則會(huì)使用這些配置設(shè)置吓蘑,而不會(huì)考慮您調(diào)用的 enterPictureInPictureMode() 函數(shù)。

可下載字體

Android 8.0 和 Android 支持庫(kù) 26 允許您從提供程序應(yīng)用請(qǐng)求字體坟冲,而無(wú)需將字體綁定到 APK 中或讓 APK 下載字體磨镶。此功能可減小 APK 大小,提高應(yīng)用安裝成功率健提,使多個(gè)應(yīng)用可以共享同一種字體琳猫。

如需了解有關(guān)下載字體的詳細(xì)信息,請(qǐng)參閱 可下載字體私痹。

XML 中的字體

Android 8.0 推出一項(xiàng)新功能脐嫂,即 XML 中的字體,允許您使用字體作為資源紊遵。這意味著账千,不再需要以資產(chǎn)的形式捆綁字體。字體在 R 文件中編譯暗膜,并且作為一種資源匀奏,可自動(dòng)用于系統(tǒng)。然后学搜,您可以利用一種新的資源類型 font 來(lái)訪問(wèn)這些字體娃善。

在運(yùn)行 API 版本 14 及更高版本的設(shè)備中,支持庫(kù) 26 對(duì)此功能提供完全支持瑞佩。

如需了解有關(guān)以資源形式使用字體以及檢索系統(tǒng)字體有關(guān)的詳細(xì)信息聚磺,請(qǐng)參閱 XML 中的字體

自動(dòng)調(diào)整 TextView 的大小

Android 8.0 允許您根據(jù) TextView 的大小自動(dòng)設(shè)置文本展開或收縮的大小炬丸。這意味著瘫寝,在不同屏幕上優(yōu)化文本大小或者優(yōu)化包含動(dòng)態(tài)內(nèi)容的文本大小比以往簡(jiǎn)單多了。如需了解有關(guān)如何在 Android 8.0 中自動(dòng)調(diào)整 TextView 的大小的詳細(xì)信息,請(qǐng)參閱自動(dòng)調(diào)整 TextView 的大小矢沿。

自適應(yīng)圖標(biāo)

Android 8.0 引入自適應(yīng)啟動(dòng)器圖標(biāo)。自適應(yīng)圖標(biāo)支持視覺效果酸纲,可在不同設(shè)備型號(hào)上顯示為各種不同的形狀捣鲸。要了解如何創(chuàng)建自適應(yīng)圖標(biāo),請(qǐng)參閱自適應(yīng)圖標(biāo)預(yù)覽功能指南闽坡。

顏色管理

圖像應(yīng)用的 Android 開發(fā)者現(xiàn)在可以利用支持廣色域彩色顯示的新設(shè)備栽惶。要顯示廣色域圖像,應(yīng)用需要在其清單(每個(gè)操作組件)中啟用一個(gè)標(biāo)志疾嗅,并加載具有嵌入的廣域彩色配置文件(AdobeRGB外厂、Pro Photo RGB、DCI-P3 等)的位圖代承。

WebView API

Android 8.0 提供多種 API汁蝶,幫助您管理在應(yīng)用中顯示網(wǎng)頁(yè)內(nèi)容的 [WebView](https://developer.android.com/reference/android/webkit/WebView) 對(duì)象。這些 API 可增強(qiáng)應(yīng)用的穩(wěn)定性和安全性论悴,它們包括:

  • Version API
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API

要詳細(xì)了解如何這些 API掖棉,請(qǐng)參閱管理 WebView

固定快捷方式和小部件

Android 8.0 引入了快捷方式和微件的應(yīng)用內(nèi)固定功能膀估。在您的應(yīng)用中幔亥,您可以根據(jù)用戶權(quán)限為支持的啟動(dòng)器創(chuàng)建固定的快捷方式和小部件。

如需了解詳細(xì)信息察纯,請(qǐng)參閱固定快捷方式和微件預(yù)覽功能指南帕棉。

最大屏幕縱橫比

以 Android 7.1(API 級(jí)別 25)或更低版本為目標(biāo)平臺(tái)的應(yīng)用默認(rèn)的最大屏幕縱橫比為 1.86。針對(duì) Android 8.0 或更高版本的應(yīng)用沒(méi)有默認(rèn)的最大縱橫比饼记。如果您的應(yīng)用需要設(shè)置最大縱橫比香伴,請(qǐng)使用定義您的操作組件的清單文件中的 maxAspectRatio 屬性。

多顯示器支持

從 Android 8.0 開始具则,此平臺(tái)為多顯示器提供增強(qiáng)的支持瞒窒。如果 Activity 支持多窗口模式,并且在具有多顯示器的設(shè)備上運(yùn)行乡洼,則用戶可以將 Activity 從一個(gè)顯示器移動(dòng)到另一個(gè)顯示器崇裁。當(dāng)應(yīng)用啟動(dòng) Activity 時(shí),此應(yīng)用可指定 Activity 應(yīng)在哪個(gè)顯示器上運(yùn)行束昵。

注:如果 Activity 支持多窗口模式拔稳,則 Android 8.0 將為該 Activity 自動(dòng)啟用多顯示器支持。您應(yīng)測(cè)試您的應(yīng)用锹雏,確保它在多顯示器環(huán)境下可正常運(yùn)行巴比。

每次只有一個(gè) Activity 可以處于繼續(xù)狀態(tài),即使此應(yīng)用具有多個(gè)顯示器。具有焦點(diǎn)的 Activity 將處于繼續(xù)狀態(tài)轻绞,所有其他可見的 Activity 均暫停采记,但不會(huì)停止。如需了解有關(guān)當(dāng)多個(gè) Activity 可見時(shí)活動(dòng)生命周期的詳細(xì)信息政勃,請(qǐng)參閱多窗口生命周期唧龄。

當(dāng)用戶將 Activity 從一個(gè)顯示器移動(dòng)到另一個(gè)顯示器時(shí),系統(tǒng)將調(diào)整 Activity 大小奸远,并根據(jù)需要發(fā)起運(yùn)行時(shí)變更既棺。您的 Activity 可以自行處理配置變更,或允許系統(tǒng)銷毀包含該 Activity 的進(jìn)程懒叛,并以新的尺寸重新創(chuàng)建它丸冕。如需了解詳細(xì)信息,請(qǐng)參閱處理配置變更薛窥。

[ActivityOptions](https://developer.android.com/reference/android/app/ActivityOptions) 提供兩個(gè)新函數(shù)以支持多個(gè)顯示器:

[setLaunchDisplayId()](https://developer.android.com/reference/android/app/ActivityOptions#setLaunchDisplayId(int))

指定 Activity 在啟動(dòng)后應(yīng)顯示在哪個(gè)顯示器上胖烛。

[getLaunchDisplayId()](https://developer.android.com/reference/android/app/ActivityOptions#getLaunchDisplayId())

返回操作組件的當(dāng)前啟動(dòng)顯示器。

對(duì) adb shell 進(jìn)行了擴(kuò)展诅迷,以支持多個(gè)顯示器洪己。shell start 命令現(xiàn)在可用于啟動(dòng)操作組件,并指定操作組件的目標(biāo)顯示器:

adb shell start <activity_name> --display <display_id>

統(tǒng)一的布局外邊距和內(nèi)邊距

Android 8.0 讓您可以更輕松地指定 [View](https://developer.android.com/reference/android/view/View) 元素的對(duì)邊使用相同外邊距和內(nèi)邊距的情形竟贯。具體來(lái)說(shuō)答捕,您現(xiàn)在可以在布局 XML 文件中使用以下屬性:

:如果您自定義應(yīng)用邏輯以支持不同語(yǔ)言和文化(包括文本方向)益眉,請(qǐng)記住,這些屬性不會(huì)影響 layout_marginStart姥份、layout_marginEnd郭脂、paddingStartpaddingEnd 的值。您可以自行設(shè)置這些值和新的垂直與水平布局屬性來(lái)創(chuàng)建取決于文本方向的布局行為澈歉。

指針捕獲

某些應(yīng)用(例如游戲展鸡、遠(yuǎn)程桌面和虛擬化客戶端)將大大受益于鼠標(biāo)指針控制。指針捕獲是 Android 8.0 中的一項(xiàng)新功能埃难,可以通過(guò)將所有鼠標(biāo)事件傳遞到您的應(yīng)用中焦點(diǎn)視圖的方式提供此類控制莹弊。

從 Android 8.0 開始涤久,您的應(yīng)用中的 [View](https://developer.android.com/reference/android/view/View) 可以請(qǐng)求指針捕獲并定義一個(gè)偵聽器來(lái)處理捕獲的指針事件。鼠標(biāo)指針在此模式下將隱藏忍弛。如果不再需要鼠標(biāo)信息响迂,該視圖可以釋放指針捕獲。系統(tǒng)也可以在視圖丟失焦點(diǎn)時(shí)(例如细疚,當(dāng)用戶打開另一個(gè)應(yīng)用時(shí))釋放指針捕獲蔗彤。

如需了解有關(guān)如何在您的應(yīng)用中使用此功能的信息,請(qǐng)參閱指針捕獲惠昔。

應(yīng)用類別

在適當(dāng)?shù)那闆r下幕与,Android 8.0 允許每個(gè)應(yīng)用聲明其所屬的類別挑势。這些類別用于將應(yīng)用呈現(xiàn)給用戶的用途或功能類似的應(yīng)用歸類在一起镇防,例如按流量消耗、電池消耗和存儲(chǔ)消耗將應(yīng)用歸類潮饱。您可以在 <application> 清單標(biāo)記中設(shè)置 android:appCategory 屬性来氧,定義應(yīng)用的類別。

Android TV 啟動(dòng)器

Android 8.0 添加了一種以內(nèi)容為中心的全新 Android TV 主屏幕體驗(yàn)香拉,支持 Android TV 模擬器和 Nexus Player Android 8.0 設(shè)備映像啦扬。新的主屏幕在對(duì)應(yīng)于頻道的行中組織視頻內(nèi)容,這些頻道在系統(tǒng)上通過(guò)應(yīng)用填充各個(gè)節(jié)目凫碌。應(yīng)用可以發(fā)布多個(gè)頻道扑毡,用戶可以配置他們希望在主屏幕上看到哪些頻道。Android TV 也包含一個(gè) Watch Next 行盛险,此行根據(jù)用戶的觀看習(xí)慣從應(yīng)用填充節(jié)目瞄摊。應(yīng)用也可以提供視頻預(yù)覽,這些預(yù)覽會(huì)在用戶聚焦到節(jié)目時(shí)自動(dòng)播放苦掘。用于填充頻道和節(jié)目的 API 屬于 TvProvider API换帜,這些 API 以 Android 支持庫(kù)模塊的形式隨 Android 8.0 分發(fā)。

AnimatorSet

從 Android 8.0 開始鹤啡,[AnimatorSet](https://developer.android.com/reference/android/animation/AnimatorSet) API 現(xiàn)在支持尋道和倒播功能惯驼。尋道功能允許您將動(dòng)畫的位置設(shè)置為指定的時(shí)間點(diǎn)處。如果您的應(yīng)用包含可撤消的操作的動(dòng)畫递瑰,倒播功能會(huì)很有用∷钌現(xiàn)在,您不必定義兩組獨(dú)立的動(dòng)畫抖部,而只需反向播放同一組動(dòng)畫疲眷。

輸入和導(dǎo)航

鍵盤導(dǎo)航鍵區(qū)

如果您的應(yīng)用中,某個(gè)操作組件使用一種復(fù)雜的視圖層次結(jié)構(gòu)(如圖 2 所示)您朽,可考慮將多組界面元素組成一個(gè)鍵區(qū)狂丝,簡(jiǎn)化鍵盤導(dǎo)航這些元素的操作换淆。用戶可以在 Chromebook 設(shè)備上按 Meta+Tab 或 Search+Tab,在不同鍵區(qū)之間導(dǎo)航几颜。鍵區(qū)的一些范例包括:側(cè)面板倍试、導(dǎo)航欄、主內(nèi)容區(qū)域和可能包含多個(gè)子元素的元素蛋哭。

包含 5 個(gè)鍵區(qū)的操作組件

要將一個(gè) [View](https://developer.android.com/reference/android/view/View)[ViewGroup](https://developer.android.com/reference/android/view/ViewGroup) 元素設(shè)置為一個(gè)鍵區(qū)县习,請(qǐng)?jiān)谠氐牟季?XML 文件中將 android:keyboardNavigationCluster 屬性設(shè)置為 true,或者將 true 傳遞至應(yīng)用界面邏輯中的 [setKeyboardNavigationCluster()](https://developer.android.com/reference/android/view/View#setKeyboardNavigationCluster(boolean))谆趾。

:鍵區(qū)不能嵌套躁愿,不過(guò),非嵌套鍵區(qū)可以顯示在層次結(jié)構(gòu)的不同層級(jí)沪蓬。如果您嘗試嵌套鍵區(qū)彤钟,框架僅會(huì)將最頂層的 [ViewGroup](https://developer.android.com/reference/android/view/ViewGroup) 元素視為鍵區(qū)。

在具有觸摸屏的設(shè)備中跷叉,您可以將某個(gè)鍵區(qū)指定的 [ViewGroup](https://developer.android.com/reference/android/view/ViewGroup) 對(duì)象的 android:touchscreenBlocksFocus 元素設(shè)置為 true逸雹,僅允許從鍵區(qū)導(dǎo)航進(jìn)入和離開此鍵區(qū)。如果您將此配置應(yīng)用于某個(gè)鍵區(qū)云挟,用戶將無(wú)法使用 Tab 鍵或箭頭鍵導(dǎo)航進(jìn)入或離開此鍵區(qū)梆砸,而是必須按鍵區(qū)導(dǎo)航鍵盤組合鍵。

視圖默認(rèn)焦點(diǎn)

在 Android 8.0 中园欣,您可以指定在(重新)創(chuàng)建的操作組件繼續(xù)運(yùn)行并且用戶按下鍵盤導(dǎo)航鍵(例如 Tab 鍵)之后應(yīng)接收焦點(diǎn)的 [View](https://developer.android.com/reference/android/view/View)帖世。要應(yīng)用“設(shè)為默認(rèn)焦點(diǎn)”設(shè)置叛买,請(qǐng)?jiān)诎缑嬖氐牟季?XML 文件中將 [View](https://developer.android.com/reference/android/view/View) 元素的 android:focusedByDefault 屬性設(shè)置為 true涧衙,或者將 true 傳遞至應(yīng)用界面邏輯中的 [setFocusedByDefault()](https://developer.android.com/reference/android/view/View#setFocusedByDefault(boolean))

系統(tǒng)

新的 StrictMode 檢測(cè)程序

Android 8.0 添加了三個(gè)新的 StrictMode 檢測(cè)程序廊勃,幫助識(shí)別應(yīng)用可能出現(xiàn)的錯(cuò)誤:

  • [detectUnbufferedIo()](https://developer.android.com/reference/android/os/StrictMode.ThreadPolicy.Builder#detectUnbufferedIo()) 將檢測(cè)您的應(yīng)用何時(shí)讀取或?qū)懭胛淳彌_的數(shù)據(jù)辉饱,這可能極大影響性能搬男。
  • [detectContentUriWithoutPermission()](https://developer.android.com/reference/android/os/StrictMode.VmPolicy.Builder#detectContentUriWithoutPermission()) 將檢測(cè)您的應(yīng)用在其外部啟動(dòng) Activity 時(shí)何時(shí)意外忘記向其他應(yīng)用授予權(quán)限。
  • [detectUntaggedSockets()](https://developer.android.com/reference/android/os/StrictMode.VmPolicy.Builder#detectUntaggedSockets()) 將檢測(cè)您的應(yīng)用何時(shí)使用網(wǎng)絡(luò)流量彭沼,而不使用 [setThreadStatsTag(int)](https://developer.android.com/reference/android/net/TrafficStats#setThreadStatsTag(int)) 將流量標(biāo)記用于調(diào)試目的缔逛。

緩存數(shù)據(jù)

Android 8.0 優(yōu)化了緩存數(shù)據(jù)的導(dǎo)航和行為。現(xiàn)在姓惑,每個(gè)應(yīng)用均獲得一定的磁盤空間配額褐奴,用于存儲(chǔ) [getCacheQuotaBytes(UUID)](https://developer.android.com/reference/android/os/storage/StorageManager#getCacheQuotaBytes(java.util.UUID)) 返回的緩存數(shù)據(jù)。

當(dāng)系統(tǒng)需要釋放磁盤空間時(shí)于毙,將開始從超過(guò)配額最多的應(yīng)用中刪除緩存文件敦冬。因此,如果將您的緩存數(shù)據(jù)量始終保持低于配額的水平唯沮,則在必須清除系統(tǒng)中的某些文件時(shí)脖旱,您的緩存文件將能堅(jiān)持到最后堪遂。系統(tǒng)在決定刪除您的應(yīng)用中的哪些緩存文件時(shí),將首先考慮刪除最舊的文件(由修改時(shí)間確定)萌庆。

您還可以針對(duì)每個(gè)目錄啟用兩種新行為溶褪,以控制系統(tǒng)如何釋放緩存數(shù)據(jù):

  • StorageManager.setCacheBehaviorAtomic() 可用于指示某個(gè)目錄及其所有內(nèi)容應(yīng)作為一個(gè)不可分割的整體進(jìn)行刪除。
  • [setCacheBehaviorTombstone(File, boolean)](https://developer.android.com/reference/android/os/storage/StorageManager#setCacheBehaviorTombstone(java.io.File,%20boolean)) 可用于指示不應(yīng)刪除某個(gè)目錄內(nèi)的文件践险,而應(yīng)將它們截?cái)嗟?0 字節(jié)長(zhǎng)度猿妈,使空文件保持完好。

最后巍虫,在需要為大文件分配磁盤空間時(shí)彭则,可考慮使用新的 [allocateBytes(FileDescriptor, long)](https://developer.android.com/reference/android/os/storage/StorageManager#allocateBytes(java.io.FileDescriptor,%20long)) API,它將自動(dòng)清除屬于其他應(yīng)用的緩存文件(根據(jù)需要)占遥,以滿足您的請(qǐng)求俯抖。在確定設(shè)備是否有足夠的磁盤空間保存您的新數(shù)據(jù)時(shí),請(qǐng)調(diào)用 [getAllocatableBytes(UUID)](https://developer.android.com/reference/android/os/storage/StorageManager#getAllocatableBytes(java.util.UUID)) 而不要使用 [getUsableSpace()](https://developer.android.com/reference/java/io/File#getUsableSpace())筷频,因?yàn)榍罢邥?huì)考慮系統(tǒng)要為您清除的任何緩存數(shù)據(jù)蚌成。

內(nèi)容提供程序分頁(yè)

我們已更新內(nèi)容提供程序以支持加載大型數(shù)據(jù)集前痘,每次加載一頁(yè)凛捏。例如,一個(gè)具有大量圖像的照片應(yīng)用可查詢要在頁(yè)面中顯示的數(shù)據(jù)的子集芹缔。內(nèi)容提供程序返回的每個(gè)結(jié)果頁(yè)面由一個(gè) Cursor 對(duì)象表示坯癣。客戶端和提供程序必須實(shí)現(xiàn)分頁(yè)才能利用此功能最欠。

如需了解有關(guān)內(nèi)容提供程序變更的詳細(xì)信息示罗,請(qǐng)參閱 [ContentProvider](https://developer.android.com/reference/android/content/ContentProvider)[ContentProviderClient](https://developer.android.com/reference/android/content/ContentProviderClient)

內(nèi)容刷新請(qǐng)求

現(xiàn)在芝硬,[ContentProvider](https://developer.android.com/reference/android/content/ContentProvider)[ContentResolver](https://developer.android.com/reference/android/content/ContentResolver) 類均包含 refresh() 函數(shù)蚜点,這樣,客戶端可以更輕松地知道所請(qǐng)求的信息是否為最新信息拌阴。

您可以擴(kuò)展 [ContentProvider](https://developer.android.com/reference/android/content/ContentProvider) 以添加自定義的內(nèi)容刷新邏輯绍绘。請(qǐng)務(wù)必重寫 [refresh()](https://developer.android.com/reference/android/content/ContentProvider#refresh(android.net.Uri,%20android.os.Bundle,%20android.os.CancellationSignal)) 函數(shù),以返回 true迟赃,告知提供程序的客戶端您已嘗試自行刷新數(shù)據(jù)陪拘。

您的客戶端應(yīng)用可通過(guò)調(diào)用另一個(gè)函數(shù)(又稱 [refresh()](https://developer.android.com/reference/android/content/ContentResolver#refresh(android.net.Uri,%20android.os.Bundle,%20android.os.CancellationSignal))),顯式請(qǐng)求已刷新的內(nèi)容纤壁。在調(diào)用此函數(shù)時(shí)左刽,傳入待刷新數(shù)據(jù)的 URI。

:由于您可能通過(guò)網(wǎng)絡(luò)不斷請(qǐng)求數(shù)據(jù)酌媒,您應(yīng)僅在有明顯跡象表明內(nèi)容確已過(guò)時(shí)時(shí)才從客戶端調(diào)用 [refresh()](https://developer.android.com/reference/android/content/ContentResolver#refresh(android.net.Uri,%20android.os.Bundle,%20android.os.CancellationSignal))欠痴。執(zhí)行此類內(nèi)容刷新最常見的原因是響應(yīng)滑動(dòng)刷新手勢(shì)迄靠,該手勢(shì)顯式請(qǐng)求當(dāng)前界面顯示最新內(nèi)容。

JobScheduler 改進(jìn)

Android 8.0 引入了對(duì) [JobScheduler](https://developer.android.com/reference/android/app/job/JobScheduler) 的多項(xiàng)改進(jìn)喇辽。由于您通忱嫠可以使用計(jì)劃作業(yè)替代現(xiàn)在受限的后臺(tái)服務(wù)或隱式廣播接收器,這些改進(jìn)可以讓您的應(yīng)用更輕松地符合新的后臺(tái)執(zhí)行限制茵臭。

[JobScheduler](https://developer.android.com/reference/android/app/job/JobScheduler) 的更新包括:

  • 您現(xiàn)在可以將工作隊(duì)列與計(jì)劃作業(yè)關(guān)聯(lián)疫诽。要將一個(gè)工作項(xiàng)添加到作業(yè)的隊(duì)列中,請(qǐng)調(diào)用 JobScheduler.enqueue()旦委。當(dāng)作業(yè)運(yùn)行時(shí)奇徒,它可以將待定工作從隊(duì)列中剝離并進(jìn)行處理。這種功能可以處理之前需要啟動(dòng)后臺(tái)服務(wù)(尤其是實(shí)現(xiàn) [IntentService](https://developer.android.com/reference/android/app/IntentService) 的服務(wù))的許多用例缨硝。
  • 您現(xiàn)在可以通過(guò)調(diào)用 JobInfo.Builder.setClipData() 的方式將 [ClipData](https://developer.android.com/reference/android/content/ClipData) 與作業(yè)關(guān)聯(lián)摩钙。利用此選項(xiàng),您可以將 URI 權(quán)限授予與作業(yè)關(guān)聯(lián)查辩,類似于這些權(quán)限傳遞到 [Context.startService()](https://developer.android.com/reference/android/content/Context#startService(android.content.Intent)) 的方式胖笛。您也可以將 URI 權(quán)限授予用于工作隊(duì)列上的 intent。
  • 計(jì)劃作業(yè)現(xiàn)在支持多個(gè)新的約束條件:
[`JobInfo.isRequireStorageNotLow()`](https://developer.android.com/reference/android/app/job/JobInfo#isRequireStorageNotLow())

如果設(shè)備的可用存儲(chǔ)空間非常低宜岛,作業(yè)將不會(huì)運(yùn)行长踊。

JobInfo.isRequireBatteryNotLow()

如果電池電量等于或低于臨界閾值,作業(yè)將不會(huì)運(yùn)行萍倡;臨界閾值是指設(shè)備顯示 Low battery warning 系統(tǒng)對(duì)話框的電量身弊。

[`NETWORK_TYPE_METERED`](https://developer.android.com/reference/android/app/job/JobInfo#NETWORK_TYPE_METERED)

作業(yè)需要一個(gè)按流量計(jì)費(fèi)的網(wǎng)絡(luò)連接,比如大多數(shù)移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)數(shù)據(jù)套餐列敲。</dd>

自定義數(shù)據(jù)存儲(chǔ)

Android 8.0 允許您為首選項(xiàng)提供自定義數(shù)據(jù)存儲(chǔ)阱佛,如果您的應(yīng)用將首選項(xiàng)存儲(chǔ)在云或本地?cái)?shù)據(jù)庫(kù)中,或者如果首選項(xiàng)特定于某個(gè)設(shè)備戴而,此功能會(huì)非常有用凑术。如需了解有關(guān)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的詳細(xì)信息,請(qǐng)參閱自定義數(shù)據(jù)存儲(chǔ)所意。

findViewById() 簽名變更

現(xiàn)在淮逊,findViewById() 函數(shù)的全部實(shí)例均返回 <T extends View> T,而不是 View扁眯。此變更會(huì)帶來(lái)以下影響:

  • 例如壮莹,如果 someMethod(View)someMethod(TextView) 均接受調(diào)用 findViewById() 的結(jié)果,這可能導(dǎo)致現(xiàn)有代碼的返回類型不確定姻檀。
  • 在使用 Java 8 源語(yǔ)言時(shí)命满,這需要在返回類型不受限制時(shí)(例如,assertNotNull(findViewById(...)).someViewMethod()))顯式轉(zhuǎn)換為 View绣版。
  • 重寫非最終的 findViewById() 函數(shù)(例如胶台,Activity.findViewById())將需要更新其返回類型歼疮。

媒體增強(qiáng)功能

VolumeShaper

有一個(gè)新的 VolumeShaper 類。您可以用它來(lái)執(zhí)行簡(jiǎn)短的自動(dòng)音量轉(zhuǎn)換诈唬,例如淡入韩脏、淡出和交叉淡入淡出。

音頻焦點(diǎn)增強(qiáng)功能

音頻應(yīng)用通過(guò)請(qǐng)求和舍棄音頻焦點(diǎn)的方式在設(shè)備上共享音頻輸出铸磅。應(yīng)用通過(guò)啟動(dòng)或停止播放或者閃避音量的方式處理處于聚焦?fàn)顟B(tài)的變更赡矢。有一個(gè)新的 AudioFocusRequest 類。對(duì)于此類阅仔,應(yīng)用在處理音頻焦點(diǎn)變化時(shí)會(huì)使用新功能自動(dòng)閃避延遲聚焦吹散。

媒體指標(biāo)

新的 getMetrics() 函數(shù)將返回一個(gè)包含配置和性能信息的 [PersistableBundle](https://developer.android.com/reference/android/os/PersistableBundle) 對(duì)象,用一個(gè)包含屬性和值的地圖表示八酒。為以下媒體類定義 getMetrics() 函數(shù):

  • [MediaPlayer.getMetrics()](https://developer.android.com/reference/android/media/MediaPlayer#getMetrics())
  • [MediaRecorder.getMetrics()](https://developer.android.com/reference/android/media/MediaRecorder#getMetrics())
  • [MediaCodec.getMetrics()](https://developer.android.com/reference/android/media/MediaCodec#getMetrics())
  • [MediaExtractor.getMetrics()](https://developer.android.com/reference/android/media/MediaExtractor#getMetrics())

為每個(gè)實(shí)例單獨(dú)收集指標(biāo)空民,并持續(xù)到實(shí)例的生命周期結(jié)束為止。如果沒(méi)有可用的指標(biāo)羞迷,則此函數(shù)將返回 null界轩。返回的實(shí)際指標(biāo)取決于類。

MediaPlayer

Android 8.0 為 MediaPlayer 類添加了多種新函數(shù)衔瓮。這些函數(shù)可以從多個(gè)方面增強(qiáng)您的應(yīng)用處理媒體播放的能力:

MediaPlayer 現(xiàn)在支持采樣級(jí)加密报辱。

音頻錄制器

  • 音頻錄制器現(xiàn)在支持對(duì)流式傳輸有用的 MPEG2_TS 格式:

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

請(qǐng)參閱 `[MediaRecorder.OutputFormat](https://developer.android.com/reference/android/media/MediaRecorder.OutputFormat)`
  • [MediaMuxer](https://developer.android.com/reference/android/media/MediaMuxer) 現(xiàn)在可以處理任意數(shù)量的音頻和視頻流与殃,而不再僅限于一個(gè)音頻曲目和/或一個(gè)視頻曲目单山。使用 [addTrack()](https://developer.android.com/reference/android/media/MediaMuxer#addTrack(android.media.MediaFormat)) 可混錄所需的任意數(shù)量的曲目碍现。
  • [MediaMuxer](https://developer.android.com/reference/android/media/MediaMuxer) 還可以添加一個(gè)或多個(gè)包含用戶定義的每幀信息的元數(shù)據(jù)曲目。元數(shù)據(jù)的格式由您的應(yīng)用定義米奸。僅對(duì) MP4 容器支持元數(shù)據(jù)曲目昼接。

元數(shù)據(jù)可以用于離線處理。例如悴晰,傳感器的陀螺儀信號(hào)可以用于執(zhí)行視頻穩(wěn)定操作慢睡。

在添加元數(shù)據(jù)曲目時(shí),曲目的 MIME 格式必須以前綴“application/”開頭铡溪。除了數(shù)據(jù)不是來(lái)源于 MediaCodec 以外漂辐,寫入元數(shù)據(jù)的操作與寫入視頻/音頻數(shù)據(jù)相同。相反棕硫,應(yīng)用將包含相關(guān)時(shí)間戳的 ByteBuffer 傳遞給 [writeSampleData()](https://developer.android.com/reference/android/media/MediaMuxer#writeSampleData(int,%20java.nio.ByteBuffer,%20android.media.MediaCodec.BufferInfo)) 函數(shù)髓涯。時(shí)間戳必須和視頻及音頻曲目處于相同的時(shí)基。

生成的 MP4 文件使用 ISOBMFF 的 12.3.3.2 部分定義的 TextMetaDataSampleEntry哈扮,指示元數(shù)據(jù)的 MIME 格式纬纪。在使用 [MediaExtractor](https://developer.android.com/reference/android/media/MediaExtractor) 提取包含元數(shù)據(jù)曲目的文件時(shí)蚓再,元數(shù)據(jù)的 MIME 格式將提取到 [MediaFormat](https://developer.android.com/reference/android/media/MediaFormat) 中。

音頻播放控制

Android 8.0 允許您查詢和請(qǐng)求設(shè)備產(chǎn)生聲音的方式包各。對(duì)音頻播放的以下控制將讓您的服務(wù)更輕松地僅在有利的設(shè)備條件下產(chǎn)生聲音摘仅。

Google 智能助理的新音頻使用類型

[AudioAttributes](https://developer.android.com/reference/android/media/AudioAttributes) 類包含一種新的聲音類型,即 [USAGE_ASSISTANT](https://developer.android.com/reference/android/media/AudioAttributes#USAGE_ASSISTANT)问畅,對(duì)應(yīng)于 Google 智能助理在設(shè)備上的回答娃属。

設(shè)備音頻播放的變更

如果您希望自己的服務(wù)僅在特定的設(shè)備音頻配置處于活動(dòng)狀態(tài)時(shí)開始產(chǎn)生聲音,您可以使用 [AudioManager](https://developer.android.com/reference/android/media/AudioManager) 類注冊(cè)一個(gè) [AudioManager.AudioPlaybackCallback](https://developer.android.com/reference/android/media/AudioManager.AudioPlaybackCallback) 實(shí)例护姆,后者的[onPlaybackConfigChanged()](https://developer.android.com/reference/android/media/AudioManager.AudioPlaybackCallback#onPlaybackConfigChanged(java.util.List%3Candroid.media.AudioPlaybackConfiguration%3E)) 函數(shù)可以幫助您確定當(dāng)前活動(dòng)的音頻屬性集膳犹。

顯式請(qǐng)求音頻焦點(diǎn)

您的服務(wù)可以使用 [requestAudioFocus()](https://developer.android.com/reference/android/media/AudioManager#requestAudioFocus(android.media.AudioFocusRequest)) 函數(shù)提交一個(gè)更精細(xì)的設(shè)備級(jí)音頻焦點(diǎn)接收請(qǐng)求。傳入一個(gè) AudioFocusRequest 對(duì)象签则,您可以使用 AudioFocusRequest.Builder 創(chuàng)建這個(gè)對(duì)象须床。在這個(gè)構(gòu)建類中,您可以指定以下選項(xiàng):

  • 您希望獲得的焦點(diǎn)類型渐裂,例如 AUDIOFOCUS_GAIN_TRANSIENTAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK豺旬。
  • 當(dāng)另一個(gè)音頻服務(wù)獲得設(shè)備焦點(diǎn)時(shí),您的服務(wù)應(yīng)以更安靜的方式繼續(xù)柒凉,還是完全暫停族阅。
  • 您的服務(wù)能否等待獲得焦點(diǎn),直至設(shè)備就緒膝捞。

:構(gòu)建您的 AudioFocusRequest 實(shí)例時(shí)坦刀,如果您通過(guò)調(diào)用 setAcceptsDelayedFocusGain() 指示您的服務(wù)可以等待產(chǎn)生聲音,您也必須調(diào)用 setOnAudioFocusChangeListener()蔬咬,以便您的服務(wù)了解它何時(shí)可以開始產(chǎn)生聲音鲤遥。

增強(qiáng)的媒體文件訪問(wèn)功能

存儲(chǔ)訪問(wèn)框架 (SAF) 允許應(yīng)用顯示自定義 [DocumentsProvider](https://developer.android.com/reference/android/provider/DocumentsProvider),后者可以為其他應(yīng)用提供訪問(wèn)數(shù)據(jù)源中的文件的權(quán)限林艘。事實(shí)上盖奈,文檔提供程序甚至可以提供駐留在網(wǎng)絡(luò)存儲(chǔ)區(qū)或使用媒體傳輸協(xié)議 (MTP) 等協(xié)議的文件的訪問(wèn)權(quán)限。

但是狐援,訪問(wèn)遠(yuǎn)程數(shù)據(jù)源中的大媒體文件面臨一些挑戰(zhàn):

  • 媒體播放器需要以尋址方式訪問(wèn)來(lái)自文檔提供程序的文件钢坦。當(dāng)大媒體文件駐留在遠(yuǎn)程數(shù)據(jù)源上時(shí),文檔提供程序必須事先提取所有數(shù)據(jù)啥酱,并創(chuàng)建快照文件描述符爹凹。媒體播放器無(wú)法播放沒(méi)有文件描述符的文件,因此在文檔提供程序完成文件下載前镶殷,無(wú)法開始播放禾酱。
  • 照片應(yīng)用等媒體集合管理器必須通過(guò)作用域文件夾遍歷一系列訪問(wèn) URI 才能訪問(wèn)存儲(chǔ)在外部 SD 卡上的媒體。這種訪問(wèn)模式會(huì)讓媒體上的批量操作(例如移動(dòng)、復(fù)制和刪除)變得非常緩慢宇植。
  • 媒體集合管理器無(wú)法根據(jù)文檔的 URI 確定其位置得封。這就讓這些類型的應(yīng)用難以允許用戶選擇媒體文件的保存位置。

Android 8.0 通過(guò)改進(jìn)存儲(chǔ)訪問(wèn)框架解決了各個(gè)挑戰(zhàn)指郁。

自定義文檔提供程序

從 Android 8.0 開始忙上,存儲(chǔ)訪問(wèn)框架允許自定義文檔提供程序為駐留在遠(yuǎn)程數(shù)據(jù)源中的文件創(chuàng)建可尋址的文件描述符。SAF 可打開文件闲坎,獲取原生可尋址的文件描述符疫粥。然后 SAF 向文檔提供程序提交離散字節(jié)請(qǐng)求。此功能使文檔提供程序可以返回媒體播放器應(yīng)用請(qǐng)求的準(zhǔn)確字節(jié)范圍腰懂,而不必事先緩存整個(gè)文件梗逮。

要使用此功能,您需要調(diào)用新的 [StorageManager.openProxyFileDescriptor()](https://developer.android.com/reference/android/os/storage/StorageManager#openProxyFileDescriptor(int,%20android.os.ProxyFileDescriptorCallback,%20android.os.Handler)) 函數(shù)绣溜。[openProxyFileDescriptor()](https://developer.android.com/reference/android/os/storage/StorageManager#openProxyFileDescriptor(int,%20android.os.ProxyFileDescriptorCallback,%20android.os.Handler)) 函數(shù)可接受 [ProxyFileDescriptorCallback](https://developer.android.com/reference/android/os/ProxyFileDescriptorCallback) 對(duì)象作為回調(diào)慷彤。任何時(shí)候,當(dāng)客戶端應(yīng)用對(duì)文檔提供程序返回的文件描述符執(zhí)行文件操作時(shí)怖喻,SAF 都會(huì)調(diào)用回調(diào)底哗。

直接文檔訪問(wèn)

從 Android 8.0 開始,您可以使用 [getDocumentUri()](https://developer.android.com/reference/android/provider/MediaStore#getDocumentUri(android.content.Context,%20android.net.Uri)) 函數(shù)獲得與給定 mediaUri 引用相同文檔的 URI锚沸。不過(guò)跋选,由于返回的 URI 由 [DocumentsProvider](https://developer.android.com/reference/android/provider/DocumentsProvider) 提供支持,媒體集合管理器可以直接訪問(wèn)文檔哗蜈,不用遍歷作用域目錄樹前标。因此,媒體管理器能夠以明顯加快的速度對(duì)文檔執(zhí)行文件操作距潘。

注意[getDocumentUri()](https://developer.android.com/reference/android/provider/MediaStore#getDocumentUri(android.content.Context,%20android.net.Uri)) 函數(shù)僅可以定位媒體文件炼列;無(wú)法授予應(yīng)用訪問(wèn)這些文件的權(quán)限。要詳細(xì)了解如何獲取媒體文件的訪問(wèn)權(quán)限绽昼,請(qǐng)參閱參考文檔唯鸭。

文檔路徑

在 Android 8.0 中使用存儲(chǔ)訪問(wèn)框架時(shí),您可以根據(jù)文檔的 ID硅确,使用 findDocumentPath() 函數(shù)(存在于 [DocumentsContract](https://developer.android.com/reference/android/provider/DocumentsContract#findDocumentPath(android.content.ContentResolver,%20android.net.Uri))[DocumentsProvider](https://developer.android.com/reference/android/provider/DocumentsProvider#findDocumentPath(java.lang.String,%20java.lang.String)) 類中)從文件系統(tǒng)的根目錄中確定路徑。該函數(shù)將在 [DocumentsContract.Path](https://developer.android.com/reference/android/provider/DocumentsContract.Path) 對(duì)象中返回此路徑明肮。如果文件系統(tǒng)對(duì)相同文檔有多個(gè)定義的路徑菱农,該函數(shù)將返回訪問(wèn)具有給定 ID 的文檔時(shí)最常使用的路徑。

此功能在下列情況下特別有用:

  • 您的應(yīng)用使用可以顯示特定文檔位置的“另存為”對(duì)話框柿估。
  • 您的應(yīng)用在搜索結(jié)果視圖中顯示文件夾并且如果用戶選擇某個(gè)文件夾循未,應(yīng)用必須加載此特定文件夾內(nèi)的子文檔。

:如果您的應(yīng)用僅具有路徑中某些文檔的訪問(wèn)權(quán)限,那么 findDocumentPath() 的返回值將僅包含您的應(yīng)用可以訪問(wèn)的文件夾和文檔的妖。

連接

WLAN 感知

Android 8.0 新增了對(duì) WLAN 感知的支持绣檬,此技術(shù)基于周邊感知聯(lián)網(wǎng) (NAN) 規(guī)范。在具有相應(yīng) WLAN 感知硬件的設(shè)備上嫂粟,應(yīng)用和附近設(shè)備可以通過(guò) WLAN 進(jìn)行搜索和通信娇未,無(wú)需依賴互聯(lián)網(wǎng)接入點(diǎn)。我們正在與硬件合作伙伴合作星虹,以盡快將 WLAN 感知技術(shù)應(yīng)用于設(shè)備零抬。要了解有關(guān)如何將 WLAN 感知集成到您的應(yīng)用中的信息,請(qǐng)參閱 WLAN 感知宽涌。

藍(lán)牙

Android 8.0 通過(guò)增加以下功能平夜,增強(qiáng)了平臺(tái)對(duì)藍(lán)牙的支持:

  • 支持 AVRCP 1.4 標(biāo)準(zhǔn),該標(biāo)準(zhǔn)支持音樂(lè)庫(kù)瀏覽卸亮。
  • 支持藍(lán)牙低功耗 (BLE) 5.0 標(biāo)準(zhǔn)忽妒。
  • 將 Sony LDAC 編解碼器集成到藍(lán)牙堆疊中。

配套設(shè)備配對(duì)

在嘗試通過(guò)藍(lán)牙兼贸、BLE 和 WLAN 與配套設(shè)備配對(duì)時(shí)锰扶,Android 8.0 提供的 API 允許您自定義配對(duì)請(qǐng)求對(duì)話框。如需了解詳細(xì)信息寝受,請(qǐng)參閱配套設(shè)備配對(duì)坷牛。

如需了解有關(guān)在 Android 上使用藍(lán)牙的詳細(xì)信息,請(qǐng)參閱藍(lán)牙指南很澄。有關(guān)對(duì)藍(lán)牙所作的特定于 Android 8.0 的變更京闰,請(qǐng)參閱 Android 8.0 行為變更頁(yè)面的藍(lán)牙部分。

共享

智能共享

Android 8.0 了解用戶的個(gè)性化分享首選項(xiàng)甩苛,在通過(guò)哪些應(yīng)用分享各個(gè)類型的內(nèi)容方面蹂楣,也有著更好的把握。例如讯蒲,如果用戶為一張收據(jù)拍照痊土,Android 8.0 可以建議費(fèi)用跟蹤應(yīng)用;如果用戶自拍墨林,一款社交媒體應(yīng)用可以更好地處理圖像赁酝。Android 8.0 可以根據(jù)用戶的個(gè)性化首選項(xiàng)自動(dòng)學(xué)習(xí)所有這些模式。

智能分享適用于 image 之外的內(nèi)容類型旭等,例如 audio酌呆、videotextURL 等搔耕。

要啟用智能分享隙袁,請(qǐng)將具有最多三個(gè)字符串注釋的 [ArrayList](https://developer.android.com/reference/java/util/ArrayList) 添加到分享內(nèi)容的 intent。這些注釋應(yīng)說(shuō)明內(nèi)容中的主要部分或主題。下面的代碼示例顯示了如何向 intent 添加注釋:

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
   Intent.EXTRA_CONTENT_ANNOTATIONS,
   annotations
);

如需了解有關(guān)智能分享注釋的詳細(xì)信息菩收,請(qǐng)參閱 [EXTRA_CONTENT_ANNOTATIONS](https://developer.android.com/reference/android/content/Intent#EXTRA_CONTENT_ANNOTATIONS)梨睁。

智能文本選擇

在兼容設(shè)備上,Android 8.0 讓應(yīng)用可以幫助用戶以更有意義的方式與文本交互娜饵。當(dāng)用戶長(zhǎng)按某個(gè)實(shí)體中可識(shí)別格式的單詞(例如某個(gè)地址或餐館名稱)時(shí)坡贺,系統(tǒng)會(huì)選中整個(gè)實(shí)體。用戶會(huì)看到一個(gè)浮動(dòng)工具欄划咐,該工具欄包含可以處理所選文本實(shí)體的應(yīng)用拴念。例如,如果系統(tǒng)識(shí)別出某個(gè)地址褐缠,它可以將用戶導(dǎo)向地圖應(yīng)用政鼠。

系統(tǒng)識(shí)別的實(shí)體包括地址、網(wǎng)址队魏、電話號(hào)碼和電子郵件地址公般。如需了解詳細(xì)信息,請(qǐng)參閱 [TextClassifier](https://developer.android.com/reference/android/view/textclassifier/TextClassifier)胡桨。

無(wú)障礙功能

Android 8.0 支持開發(fā)者使用以下無(wú)障礙功能創(chuàng)建自己的無(wú)障礙服務(wù)官帘。如需了解有關(guān)如何讓您的應(yīng)用更便于訪問(wèn)的更多信息,請(qǐng)參閱無(wú)障礙功能昧谊。

無(wú)障礙功能按鈕

您的無(wú)障礙服務(wù)現(xiàn)在可以請(qǐng)求在系統(tǒng)的導(dǎo)航區(qū)域顯示無(wú)障礙功能按鈕刽虹,該按鈕讓用戶可從其設(shè)備上的任意位置快速激活您的服務(wù)功能。要執(zhí)行此操作呢诬,請(qǐng)?jiān)谀硞€(gè) [AccessibilityServiceInfo](https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo) 對(duì)象的 android:accessibilityFlags 屬性中添加 [FLAG_REQUEST_ACCESSIBILITY_BUTTON](https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo#FLAG_REQUEST_ACCESSIBILITY_BUTTON) 標(biāo)志涌哲。稍后,您可以使用 [registerAccessibilityButtonCallback()](https://developer.android.com/reference/android/accessibilityservice/AccessibilityButtonController#registerAccessibilityButtonCallback(android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback)) 注冊(cè)回調(diào)尚镰。

:此功能僅適用于提供軟件渲染導(dǎo)航區(qū)域的設(shè)備阀圾。請(qǐng)始終使用 [isAccessibilityButtonAvailable()](https://developer.android.com/reference/android/accessibilityservice/AccessibilityButtonController#isAccessibilityButtonAvailable()),并通過(guò)實(shí)現(xiàn) [onAvailabilityChanged()](https://developer.android.com/reference/android/accessibilityservice/AccessibilityButtonController.AccessibilityButtonCallback#onAvailabilityChanged(android.accessibilityservice.AccessibilityButtonController,%20boolean)) 根據(jù)無(wú)障礙功能按鈕的可用性來(lái)響應(yīng)變更狗唉。通過(guò)該方式初烘,用戶可以始終訪問(wèn)您的服務(wù)功能,即使該無(wú)障礙功能按鈕不受支持或變得不可用分俯。

獨(dú)立的音量調(diào)整

Android 8.0 引入了 [STREAM_ACCESSIBILITY](https://developer.android.com/reference/android/media/AudioManager#STREAM_ACCESSIBILITY) 音量類別肾筐,允許您單獨(dú)控制無(wú)障礙服務(wù)音頻輸出的音量,而不會(huì)影響設(shè)備上的其他聲音澳迫。

要使用這個(gè)新的流類型來(lái)控制無(wú)障礙服務(wù)音量局齿,請(qǐng)?jiān)跓o(wú)障礙服務(wù)中設(shè)置 [FLAG_ENABLE_ACCESSIBILITY_VOLUME](https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo#FLAG_ENABLE_ACCESSIBILITY_VOLUME) 選項(xiàng)。然后橄登,您可以使用 [adjustStreamVolume()](https://developer.android.com/reference/android/media/AudioManager#adjustStreamVolume(int,%20int,%20int)) 更改設(shè)備的無(wú)障礙服務(wù)音頻音量。

指紋手勢(shì)

您的無(wú)障礙服務(wù)也可以響應(yīng)替代的輸入機(jī)制,即沿設(shè)備的指紋傳感器按特定方向滑動(dòng)(上拢锹、下谣妻、左和右)。要接收有關(guān)這些交互的回調(diào)卒稳,請(qǐng)完成以下一系列步驟:

  1. 聲明 USE_FINGERPRINT 權(quán)限和 [CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES](https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo#CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES) 功能蹋半。
  2. android:accessibilityFlags 屬性中設(shè)置 [FLAG_REQUEST_FINGERPRINT_GESTURES](https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo#FLAG_REQUEST_FINGERPRINT_GESTURES) 標(biāo)志。
  3. 使用 [registerFingerprintGestureCallback()](https://developer.android.com/reference/android/accessibilityservice/FingerprintGestureController#registerFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback,%20android.os.Handler)) 注冊(cè)回調(diào)充坑。

請(qǐng)記住减江,并非所有設(shè)備都包含指紋傳感器。您可以使用 [isHardwareDetected()](https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager#isHardwareDetected()) 函數(shù)識(shí)別設(shè)備是否支持此傳感器捻爷。即使對(duì)于包含指紋傳感器的設(shè)備辈灼,您的服務(wù)也只有在指紋傳感器不用于身份驗(yàn)證目的時(shí)才可使用它。要識(shí)別此傳感器何時(shí)可用也榄,請(qǐng)調(diào)用 [isGestureDetectionAvailable()](https://developer.android.com/reference/android/accessibilityservice/FingerprintGestureController#isGestureDetectionAvailable()) 函數(shù)并實(shí)現(xiàn) [onGestureDetectionAvailabilityChanged()](https://developer.android.com/reference/android/accessibilityservice/FingerprintGestureController.FingerprintGestureCallback#onGestureDetectionAvailabilityChanged(boolean)) 回調(diào)巡莹。

字詞級(jí)突出顯示

要確定 [TextView](https://developer.android.com/reference/android/widget/TextView) 對(duì)象中可見字符的位置,您可以在 [EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY) 中將其作為第一個(gè)參數(shù)傳遞到 [refreshWithExtraData()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#refreshWithExtraData(java.lang.String,%20android.os.Bundle)) 中甜紫。隨后會(huì)更新您為 [refreshWithExtraData()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#refreshWithExtraData(java.lang.String,%20android.os.Bundle)) 提供的作為第二個(gè)參數(shù)的 [Bundle](https://developer.android.com/reference/android/os/Bundle) 對(duì)象降宅,使之包含一個(gè)可打包的 [Rect](https://developer.android.com/reference/android/graphics/Rect) 對(duì)象數(shù)組。每個(gè) [Rect](https://developer.android.com/reference/android/graphics/Rect) 對(duì)象代表某個(gè)特定字符的邊界框囚霸。

如果您的服務(wù)使用 [TextToSpeech](https://developer.android.com/reference/android/speech/tts/TextToSpeech) 對(duì)象朗讀屏幕上出現(xiàn)的內(nèi)容腰根,您可以獲取有關(guān)文本到語(yǔ)音轉(zhuǎn)換引擎何時(shí)開始朗讀單個(gè)合成字詞時(shí)的準(zhǔn)確時(shí)間信息,前提是文本到語(yǔ)音轉(zhuǎn)換引擎提供此信息拓型。當(dāng)引擎即將開始播放特定范圍文本的音頻時(shí)额嘿,Text-to-Speech API 會(huì)通知您的服務(wù),將使用 [onRangeStart()](https://developer.android.com/reference/android/speech/tts/UtteranceProgressListener#onRangeStart(java.lang.String,%20int,%20int,%20int)) 函數(shù)開始朗讀此范圍的文本吨述。

如果您創(chuàng)建自己的 [TextToSpeechService](https://developer.android.com/reference/android/speech/tts/TextToSpeechService) 實(shí)現(xiàn)岩睁,您可以使用 [rangeStart()](https://developer.android.com/reference/android/speech/tts/SynthesisCallback#rangeStart(int,%20int,%20int)) 函數(shù)支持這一新功能。

標(biāo)準(zhǔn)化單端范圍值

[AccessibilityNodeInfo](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo) 的一些實(shí)例使用 [AccessibilityNodeInfo.RangeInfo](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.RangeInfo) 的某個(gè)實(shí)例來(lái)表明界面元素可接受一定范圍的值揣云。使用 [RangeInfo.obtain()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.RangeInfo#obtain(int,%20float,%20float,%20float)) 創(chuàng)建范圍或使用 [getMin()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.RangeInfo#getMin())[getMax()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.RangeInfo#getMax()) 檢索此范圍的極值時(shí)捕儒,請(qǐng)注意,Android 8.0 規(guī)定了標(biāo)準(zhǔn)化單端范圍:

  • 對(duì)于沒(méi)有最小值的范圍邓夕,[Float.NEGATIVE_INFINITY](https://developer.android.com/reference/java/lang/Float#NEGATIVE_INFINITY) 表示最小值刘莹。
  • 對(duì)于沒(méi)有最大值的范圍,[Float.POSITIVE_INFINITY](https://developer.android.com/reference/java/lang/Float#POSITIVE_INFINITY) 表示最大值焚刚。

提示文本

Android 8.0 包含可用于與文本可編輯對(duì)象的提示文本進(jìn)行交互的多個(gè)函數(shù):

  • [isShowingHintText()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#isShowingHintText())[setShowingHintText()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#setShowingHintText(boolean)) 函數(shù)分別顯示和設(shè)置節(jié)點(diǎn)的當(dāng)前文本內(nèi)容是否表示節(jié)點(diǎn)的提示文本点弯。如果節(jié)點(diǎn)不包含可編輯文本,則它不應(yīng)包含提示文本矿咕。
  • 要訪問(wèn)提示文本本身抢肛,請(qǐng)使用 [getHintText()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#getHintText())狼钮。即使某個(gè)對(duì)象當(dāng)前未顯示提示文本,系統(tǒng)也能成功調(diào)用 [getHintText()](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo#getHintText())捡絮。

連續(xù)的手勢(shì)分派

您的服務(wù)現(xiàn)在可以使用 [GestureDescription.StrokeDescription](https://developer.android.com/reference/android/accessibilityservice/GestureDescription.StrokeDescription) 構(gòu)造函數(shù)中的最后一個(gè)參數(shù) willContinue熬芜,指定屬于同一設(shè)定手勢(shì)的筆劃的順序。

安全性與隱私

權(quán)限

Android 8.0 引入了多個(gè)與電話有關(guān)的新權(quán)限:

  • ANSWER_PHONE_CALLS 允許您的應(yīng)用通過(guò)編程方式接聽呼入電話福稳。要在您的應(yīng)用中處理呼入電話涎拉,您可以使用 [acceptRingingCall()](https://developer.android.com/reference/android/telecom/TelecomManager#acceptRingingCall()) 函數(shù)。
  • READ_PHONE_NUMBERS 權(quán)限允許您的應(yīng)用讀取設(shè)備中存儲(chǔ)的電話號(hào)碼的圆。

這些權(quán)限均被劃分為危險(xiǎn)類別鼓拧,屬于 PHONE 權(quán)限組。

新的帳號(hào)訪問(wèn)和 Discovery API

Android 8.0 對(duì)應(yīng)用訪問(wèn)用戶帳號(hào)的方式引入多項(xiàng)改進(jìn)越妈。對(duì)于由身份驗(yàn)證器管理的帳號(hào)季俩,身份驗(yàn)證器在決定對(duì)應(yīng)用隱藏帳號(hào)還是顯示帳號(hào)時(shí)可以使用自己的策略。Android 系統(tǒng)跟蹤可以訪問(wèn)特定帳號(hào)的應(yīng)用叮称。

在以前的 Android 版本中种玛,想要跟蹤用戶帳號(hào)列表的應(yīng)用必須獲取有關(guān)所有帳號(hào)的更新,包括具有不相關(guān)類型的帳號(hào)瓤檐。Android 8.0 添加了 [addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])](https://developer.android.com/reference/android/accounts/AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener,%20android.os.Handler,%20boolean,%20java.lang.String[])) 函數(shù)赂韵,其允許應(yīng)用指定應(yīng)接收帳號(hào)變更的帳號(hào)類型列表。

API 變更

AccountManager 提供六個(gè)新函數(shù)以幫助身份驗(yàn)證器管理哪些應(yīng)用可以查看某個(gè)帳號(hào):

  • [setAccountVisibility(android.accounts.Account, java.lang.String, int)](https://developer.android.com/reference/android/accounts/AccountManager#setAccountVisibility(android.accounts.Account,%20java.lang.String,%20int)):針對(duì)特定用戶帳號(hào)和軟件包組合設(shè)置可見性級(jí)別挠蛉。
  • [getAccountVisibility(android.accounts.Account, java.lang.String)](https://developer.android.com/reference/android/accounts/AccountManager#getAccountVisibility(android.accounts.Account,%20java.lang.String)):獲取特定用戶帳號(hào)和軟件包組合的可見性級(jí)別祭示。
  • [getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)](https://developer.android.com/reference/android/accounts/AccountManager#getAccountsAndVisibilityForPackage(java.lang.String,%20java.lang.String)):允許身份驗(yàn)證器獲取帳號(hào)和給定軟件包的可見性級(jí)別。
  • [getPackagesAndVisibilityForAccount(android.accounts.Account)](https://developer.android.com/reference/android/accounts/AccountManager#getPackagesAndVisibilityForAccount(android.accounts.Account)):允許身份驗(yàn)證器獲取存儲(chǔ)的給定帳號(hào)的可見性值谴古。
  • [addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)](https://developer.android.com/reference/android/accounts/AccountManager#addAccountExplicitly(android.accounts.Account,%20java.lang.String,%20android.os.Bundle,%20java.util.Map%3Cjava.lang.String,%20java.lang.Integer%3E)):允許身份驗(yàn)證器初始化帳號(hào)的可見性值质涛。
  • [addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])](https://developer.android.com/reference/android/accounts/AccountManager#addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener,%20android.os.Handler,%20boolean,%20java.lang.String[])):將 [OnAccountsUpdateListener](https://developer.android.com/reference/android/accounts/OnAccountsUpdateListener) 偵聽器添加到 [AccountManager](https://developer.android.com/reference/android/accounts/AccountManager) 對(duì)象。無(wú)論設(shè)備上的帳號(hào)列表何時(shí)發(fā)生變化掰担,系統(tǒng)都將調(diào)用此偵聽器汇陆。

Android 8.0 引入兩個(gè)特殊的軟件包名稱值,以使用 [setAccountVisibility(android.accounts.Account, java.lang.String, int)](https://developer.android.com/reference/android/accounts/AccountManager#setAccountVisibility(android.accounts.Account,%20java.lang.String,%20int)) 函數(shù)指定未設(shè)置的應(yīng)用的可見性級(jí)別带饱。[PACKAGE_NAME_KEY_LEGACY_VISIBLE](https://developer.android.com/reference/android/accounts/AccountManager#PACKAGE_NAME_KEY_LEGACY_VISIBLE) 可見性值應(yīng)用于具有 [GET_ACCOUNTS](https://developer.android.com/reference/android/Manifest.permission#GET_ACCOUNTS) 權(quán)限的應(yīng)用毡代,并且其目標(biāo) Android 版本低于 Android 8.0,或其簽名與針對(duì)任意 Android 版本的身份驗(yàn)證器匹配勺疼。[PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE](https://developer.android.com/reference/android/accounts/AccountManager#PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE) 為之前未設(shè)置的應(yīng)用提供默認(rèn)的可見性值教寂,對(duì)于此類應(yīng)用,[PACKAGE_NAME_KEY_LEGACY_VISIBLE](https://developer.android.com/reference/android/accounts/AccountManager#PACKAGE_NAME_KEY_LEGACY_VISIBLE) 不適用执庐。

如需了解有關(guān)新的帳號(hào)訪問(wèn)和發(fā)現(xiàn) API 的詳細(xì)信息酪耕,請(qǐng)參閱 [AccountManager](https://developer.android.com/reference/android/accounts/AccountManager)[OnAccountsUpdateListener](https://developer.android.com/reference/android/accounts/OnAccountsUpdateListener) 參考。

Google Safe Browsing API

[WebView](https://developer.android.com/reference/android/webkit/WebView) 類現(xiàn)在添加了一個(gè) Safe Browsing API 來(lái)增強(qiáng)網(wǎng)絡(luò)瀏覽的安全性轨淌。如需了解詳細(xì)信息迂烁,請(qǐng)參閱 Google Safe Browsing API看尼。

測(cè)試

儀器測(cè)試

Android 8.0 為應(yīng)用的儀器測(cè)試提供以下幾項(xiàng)額外支持。

針對(duì)非默認(rèn)應(yīng)用進(jìn)程運(yùn)行

現(xiàn)在婚被,您可以指定針對(duì)您的應(yīng)用的默認(rèn)進(jìn)程以外的進(jìn)程運(yùn)行特定儀器測(cè)試狡忙。如果您的應(yīng)用包含多個(gè)在不同進(jìn)程中運(yùn)行的操作組件梳虽,此配置非常有用址芯。

要定義非默認(rèn)進(jìn)程儀器測(cè)試,請(qǐng)導(dǎo)航至您的清單文件窜觉,然后導(dǎo)航至所需的 <instrumentation> 元素谷炸。添加 android:targetProcess 屬性,并將它的值設(shè)置為以下值之一:

  • 特定進(jìn)程的名稱禀挫。
  • 以逗號(hào)分隔的進(jìn)程名稱列表旬陡。
  • 通配符("*"),允許針對(duì)任何執(zhí)行 android:targetPackage 屬性中指定的軟件包中的代碼的已啟動(dòng)進(jìn)程運(yùn)行儀器測(cè)試语婴。

在執(zhí)行儀器測(cè)試時(shí)描孟,您可以通過(guò)調(diào)用 [getProcessName()](https://developer.android.com/reference/android/app/Instrumentation#getProcessName()) 檢查正在測(cè)試哪個(gè)進(jìn)程。

在測(cè)試過(guò)程中報(bào)告結(jié)果

現(xiàn)在砰左,通過(guò)調(diào)用 [addResults()](https://developer.android.com/reference/android/app/Instrumentation#addResults(android.os.Bundle))匿醒,您可以在執(zhí)行儀器測(cè)試時(shí)(而不用等到測(cè)試后)報(bào)告結(jié)果。

用于測(cè)試的模擬 Intent

為了更輕松地為您應(yīng)用的操作組件創(chuàng)建隔離缠导、獨(dú)立的界面測(cè)試廉羔,Android 8.0 引入了 [onStartActivity()](https://developer.android.com/reference/android/app/Instrumentation.ActivityMonitor#onStartActivity(android.content.Intent)) 函數(shù)。要處理您的測(cè)試類調(diào)用的特定 intent僻造,您可以在 [Instrumentation.ActivityMonitor](https://developer.android.com/reference/android/app/Instrumentation.ActivityMonitor) 類的自定義子類中替換此函數(shù)憋他。

當(dāng)您的測(cè)試類調(diào)用 intent 時(shí),該函數(shù)將返回一個(gè)存根 [Instrumentation.ActivityResult](https://developer.android.com/reference/android/app/Instrumentation.ActivityResult) 對(duì)象髓削,而不是執(zhí)行 intent 本身竹挡。通過(guò)在您的測(cè)試中使用這種模擬 intent 邏輯,您可以側(cè)重于自己的操作組件如何準(zhǔn)備和處理您傳遞到不同操作組件或完全不同的應(yīng)用中的 intent立膛。

運(yùn)行時(shí)和工具

平臺(tái)優(yōu)化

Android 8.0 為平臺(tái)引入了運(yùn)行時(shí)優(yōu)化和其他優(yōu)化揪罕,這些優(yōu)化將帶來(lái)多項(xiàng)性能改進(jìn)。這些優(yōu)化包括并發(fā)壓縮垃圾回收旧巾、更有效的內(nèi)存利用和代碼區(qū)域耸序。

它們可以加快啟動(dòng)時(shí)間,并為 OS 和應(yīng)用帶來(lái)更好的性能鲁猩。

更新的 Java 支持

Android 8.0 添加了對(duì)更多 OpenJDK Java API 的支持:

  • OpenJDK 8 中的 [java.time](https://developer.android.com/reference/java/time/package-summary)坎怪。
  • OpenJDK 7 中的 [java.nio.file](https://developer.android.com/reference/java/nio/file/package-summary)[java.lang.invoke](https://developer.android.com/reference/java/lang/invoke/package-summary)母蛛。

要詳細(xì)了解這些新添加的軟件包中的類和函數(shù)慎冤,請(qǐng)參閱 API 參考文檔。

如果您想要在 Android Studio 中使用 Java 8 語(yǔ)言功能,您應(yīng)下載最新的預(yù)覽版本狈谊。

更新的 ICU4J Android Framework API

Android 8.0 擴(kuò)展了 ICU4J Android 框架 API—,它是 ICU4J API 的子集—搞疗,供應(yīng)用開發(fā)者在 android.icu 軟件包中使用嗤朴。這些 API 使用設(shè)備上具有的本地化數(shù)據(jù)。因此沐飘,您無(wú)需在 APK 中編譯 ICU4J 庫(kù)游桩,從而減少 APK 占用空間。

表 1. Android 中使用的 ICU耐朴、CLDR 和 Unicode 版本借卧。

| Android API 級(jí)別 | ICU 版本 | CLDR 版本 | Unicode 版本 |
| Android 7.0(API 級(jí)別 24),Android 7.1(API 級(jí)別 25) | 56 | 28 | 8.0 |
| Android 8.0 | 58.2 | 30.0.3 | 9.0 |

如需詳細(xì)了解針對(duì)受支持的 ICU4J API 的更新筛峭,請(qǐng)閱讀版本說(shuō)明铐刘。

Android 企業(yè)版

已為運(yùn)行 Android 8.0 的設(shè)備引入新的企業(yè)功能和 API。重要功能包括如下:

  • 完全托管的設(shè)備中的工作資料使企業(yè)可以在管理工作數(shù)據(jù)與個(gè)人數(shù)據(jù)的同時(shí)影晓,將它們分離開來(lái)镰吵。
  • API 委派允許設(shè)備所有者和個(gè)人資料所有者將應(yīng)用管理分配給其他應(yīng)用。
  • 配置流程中的用戶體驗(yàn)改進(jìn)措施(包含新的自定義選項(xiàng))縮短了設(shè)置時(shí)間挂签。
  • 藍(lán)牙疤祭、WLAN、備份和安全性方面的新增控制選項(xiàng)使企業(yè)可以更精細(xì)地管理設(shè)備竹握。網(wǎng)絡(luò)操作組件日志記錄可幫助企業(yè)追查問(wèn)題画株。

如需詳細(xì)了解上述及其他新增 Android 企業(yè)版 API 和功能,請(qǐng)參閱企業(yè)中的 Android啦辐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谓传,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芹关,更是在濱河造成了極大的恐慌续挟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侥衬,死亡現(xiàn)場(chǎng)離奇詭異诗祸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轴总,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門直颅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人怀樟,你說(shuō)我怎么就攤上這事功偿。” “怎么了往堡?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵械荷,是天一觀的道長(zhǎng)共耍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吨瞎,這世上最難降的妖魔是什么痹兜? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮颤诀,結(jié)果婚禮上字旭,老公的妹妹穿的比我還像新娘。我一直安慰自己着绊,他們只是感情好谐算,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著归露,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斤儿。 梳的紋絲不亂的頭發(fā)上剧包,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音往果,去河邊找鬼疆液。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陕贮,可吹牛的內(nèi)容都是我干的堕油。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肮之,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掉缺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起戈擒,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眶明,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后筐高,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搜囱,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年柑土,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜀肘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稽屏,死狀恐怖扮宠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诫欠,我是刑警寧澤涵卵,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布浴栽,位于F島的核電站,受9級(jí)特大地震影響轿偎,放射性物質(zhì)發(fā)生泄漏典鸡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一坏晦、第九天 我趴在偏房一處隱蔽的房頂上張望萝玷。 院中可真熱鬧,春花似錦昆婿、人聲如沸球碉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)睁冬。三九已至,卻和暖如春看疙,著一層夾襖步出監(jiān)牢的瞬間豆拨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工能庆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留施禾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓搁胆,卻偏偏與公主長(zhǎng)得像弥搞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渠旁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353