Android 8.0 功能(系統篇)

極力推薦Android 開發大總結文章:歡迎收藏 程序員Android 力薦 ,Android 開發者須要的必備技能 java

Android 8.0 Oreo更智能、更迅捷、更強大。廣受世人喜好的不只僅是曲奇餅乾,更是爲您打造的全新 Android 系統。Android 8.0爲用戶和開發者引入多種新功能。本文重點介紹面向開發者的新功能。 請務必查閱 Android 8.0 行爲變動以瞭解平臺變動可能影響您的應用的領域。 經過本篇文章閱讀,您將獲取到如下內容:android

  1. 新的 StrictMode 檢測程序
  2. 緩存數據
  3. 內容提供程序分頁
  4. 內容刷新請求
  5. JobScheduler 改進
  6. 自定義數據存儲
  7. findViewById() 簽名變動
  8. 媒體加強功能
  9. MediaPlayer
  10. 音頻播放控制
  11. 加強的媒體文件訪問功能
  12. 自定義文檔提供程序
  13. 鏈接
  14. 共享
  15. 智能文本選擇
  16. 無障礙功能
  17. 獨立的音量調整
  18. 指紋手勢
  19. 字詞級突出顯示
  20. 標準化單端範圍值
  21. 提示文本
  22. 安全性與隱私
  23. 新的賬號訪問和 Discovery API
  24. Google Safe Browsing API
  25. 測試
  26. 運行時和工具
  27. Android 企業版

1.新的 StrictMode 檢測程序

Android 8.0添加了三個新的 StrictMode 檢測程序,幫助識別應用可能出現的錯誤:程序員

  • detectUnbufferedIo()將檢測您的應用什麼時候讀取或寫入未緩衝的數據,這可能極大影響性能。
  • detectContentUriWithoutPermission() 將檢測您的應用在其外部啓動 Activity 時什麼時候意外忘記向其餘應用授予權限。
  • detectUntaggedSockets()將檢測您的應用什麼時候使用網絡流量,而不使用 setThreadStatsTag(int)將流量標記用於調試目的。

2 . 緩存數據

Android 8.0 優化了緩存數據的導航和行爲。如今,每一個應用均得到必定的磁盤空間配額,用於存儲 getCacheQuotaBytes(UUID)返回的緩存數據。數據庫

當系統須要釋放磁盤空間時,將開始從超過配額最多的應用中刪除緩存文件。所以,若是將您的緩存數據量始終保持低於配額的水平,則在必須清除系統中的某些文件時,您的緩存文件將能堅持到最後。系統在決定刪除您的應用中的哪些緩存文件時,將首先考慮刪除最舊的文件(由修改時間肯定)。編程

您還能夠針對每一個目錄啓用兩種新行爲,以控制系統如何釋放緩存數據:數組

  • StorageManager.setCacheBehaviorAtomic() 可用於指示某個目錄及其全部內容應做爲一個不可分割的總體進行刪除。
  • setCacheBehaviorTombstone(File, boolean) 可用於指示不該刪除某個目錄內的文件,而應將它們截斷到 0 字節長度,使空文件保持無缺。 最後,在須要爲大文件分配磁盤空間時,可考慮使用新的 allocateBytes(FileDescriptor, long) API,它將自動清除屬於其餘應用的緩存文件(根據須要),以知足您的請求。在肯定設備是否有足夠的磁盤空間保存您的新數據時,請調用 getAllocatableBytes(UUID) 而不要使用 getUsableSpace(),由於前者會考慮系統要爲您清除的任何緩存數據。

3. 內容提供程序分頁

咱們已更新內容提供程序以支持加載大型數據集,每次加載一頁。例如,一個具備大量圖像的照片應用可查詢要在頁面中顯示的數據的子集。內容提供程序返回的每一個結果頁面由一個 Cursor 對象表示。客戶端和提供程序必須實現分頁才能利用此功能。緩存

如需瞭解有關內容提供程序變動的詳細信息,請參閱 ContentProviderContentProviderClient安全

#4 . 內容刷新請求bash

如今,ContentProviderContentResolver 類均包含 refresh()函數,這樣,客戶端能夠更輕鬆地知道所請求的信息是否爲最新信息。微信

您能夠擴展ContentProvider以添加自定義的內容刷新邏輯。請務必重寫refresh() 函數,以返回true,告知提供程序的客戶端您已嘗試自行刷新數據。

您的客戶端應用可經過調用另外一個函數(又稱 refresh()),顯式請求已刷新的內容。在調用此函數時,傳入待刷新數據的URI

注:因爲您可能經過網絡不斷請求數據,您應僅在有明顯跡象代表內容確已過期時才從客戶端調用 refresh()。執行此類內容刷新最多見的緣由是響應滑動刷新手勢,該手勢顯式請求當前界面顯示最新內容。

5. JobScheduler 改進

Android 8.0 引入了對 JobScheduler的多項改進。因爲您一般可使用計劃做業替代如今受限的後臺服務或隱式廣播接收器,這些改進可讓您的應用更輕鬆地符合新的後臺執行限制。

JobScheduler 的更新包括:

  • 您如今能夠將工做隊列與計劃做業關聯。要將一個工做項添加到做業的隊列中,請調用 JobScheduler.enqueue()。看成業運行時,它能夠將待定工做從隊列中剝離並進行處理。這種功能能夠處理以前須要啓動後臺服務(尤爲是實現 IntentService 的服務)的許多用例。
  • 您如今能夠經過調用 JobInfo.Builder.setClipData()的方式將ClipData 與做業關聯。利用此選項,您能夠將 URI 權限授予與做業關聯,相似於這些權限傳遞到 Context.startService()的方式。您也能夠將 URI 權限授予用於工做隊列上的intent
  • 計劃做業如今支持多個新的約束條件: JobInfo.isRequireStorageNotLow() 若是設備的可用存儲空間很是低,做業將不會運行。 JobInfo.isRequireBatteryNotLow() 若是電池電量等於或低於臨界閾值,做業將不會運行;臨界閾值是指設備顯示 Low battery warning 系統對話框的電量。 NETWORK_TYPE_METERED 做業須要一個按流量計費的網絡鏈接,好比大多數移動數據網絡數據套餐。

6. 自定義數據存儲

Android 8.0 容許您爲首選項提供自定義數據存儲,若是您的應用將首選項存儲在雲或本地數據庫中,或者若是首選項特定於某個設備,此功能會很是有用。如需瞭解有關實現數據存儲的詳細信息,請參閱自定義數據存儲。

7. findViewById() 簽名變動

如今,findViewById() 函數的所有實例均返回 <T extends View> T,而不是 View。此變動會帶來如下影響:

  • 例如,若是someMethod(View)someMethod(TextView)均接受調用findViewById()的結果,這可能致使現有代碼的返回類型不肯定。
  • 在使用 Java 8 源語言時,這須要在返回類型不受限制時(例如,assertNotNull(findViewById(...)).someViewMethod()))顯式轉換爲 View。
  • 重寫非最終的findViewById() 函數(例如,Activity.findViewById())將須要更新其返回類型。

8. 媒體加強功能

有一個新的 VolumeShaper 類。您能夠用它來執行簡短的自動音量轉換,例如淡入、淡出和交叉淡入淡出。

音頻焦點加強功能

音頻應用經過請求和捨棄音頻焦點的方式在設備上共享音頻輸出。應用經過啓動或中止播放或者閃避音量的方式處理處於聚焦狀態的變動。有一個新的 AudioFocusRequest 類。對於此類,應用在處理音頻焦點變化時會使用新功能:自動閃避和延遲聚焦

媒體指標

新的 getMetrics() 函數將返回一個包含配置和性能信息的 PersistableBundle對象,用一個包含屬性和值的地圖表示。爲如下媒體類定義 getMetrics()函數:

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

爲每一個實例單獨收集指標,並持續到實例的生命週期結束爲止。若是沒有可用的指標,則此函數將返回 null。返回的實際指標取決於類。

9 . MediaPlayer

Android 8.0 爲 MediaPlayer類添加了多種新函數。這些函數能夠從多個方面加強您的應用處理媒體播放的能力:

在搜索幀時進行精細控制。 播放受數字版權管理保護的材料的功能。 MediaPlayer 如今支持採樣級加密。

音頻錄製器

音頻錄製器如今支持對流式傳輸有用的 MPEG2_TS 格式:

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

請參閱 MediaRecorder.OutputFormat

  • MediaMuxer如今能夠處理任意數量的音頻和視頻流,而再也不僅限於一個音頻曲目和/或一個視頻曲目。使用 addTrack()可混錄所需的任意數量的曲目。

  • MediaMuxer 還能夠添加一個或多個包含用戶定義的每幀信息的元數據曲目。元數據的格式由您的應用定義。僅對 MP4 容器支持元數據曲目。 元數據能夠用於離線處理。例如,傳感器的陀螺儀信號能夠用於執行視頻穩定操做。

在添加元數據曲目時,曲目的 MIME格式必須之前綴「application/」開頭。除了數據不是來源於 MediaCodec之外,寫入元數據的操做與寫入視頻/音頻數據相同。相反,應用將包含相關時間戳的 ByteBuffer 傳遞給 writeSampleData()函數。時間戳必須和視頻及音頻曲目處於相同的時基。

生成的 MP4 文件使用 ISOBMFF 的 12.3.3.2 部分定義的 TextMetaDataSampleEntry,指示元數據的 MIME 格式。在使用MediaExtractor 提取包含元數據曲目的文件時,元數據的 MIME 格式將提取到 MediaFormat` 中。

10. 音頻播放控制

Android 8.0 容許您查詢和請求設備產生聲音的方式。對音頻播放的如下控制將讓您的服務更輕鬆地僅在有利的設備條件下產生聲音。

Google 智能助理的新音頻使用類型 AudioAttributes 類包含一種新的聲音類型,即 USAGE_ASSISTANT,對應於 Google 智能助理在設備上的回答。

設備音頻播放的變動

若是您但願本身的服務僅在特定的設備音頻配置處於活動狀態時開始產生聲音,您可使用 AudioManager類註冊一個AudioManager.AudioPlaybackCallback實例,後者的onPlaybackConfigChanged()函數能夠幫助您肯定當前活動的音頻屬性集。

顯式請求音頻焦點

您的服務可使用 requestAudioFocus()函數提交一個更精細的設備級音頻焦點接收請求。傳入一個 AudioFocusRequest 對象,您可使用 AudioFocusRequest.Builder建立這個對象。在這個構建類中,您能夠指定如下選項:

  • 您但願得到的焦點類型,例如 AUDIOFOCUS_GAIN_TRANSIENT 或 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
  • 當另外一個音頻服務得到設備焦點時,您的服務應以更安靜的方式繼續,仍是徹底暫停。
  • 您的服務可否等待得到焦點,直至設備就緒。

注:構建您的 AudioFocusRequest 實例時,若是您經過調用 setAcceptsDelayedFocusGain() 指示您的服務能夠等待產生聲音,您也必須調用 setOnAudioFocusChangeListener(),以便您的服務瞭解它什麼時候能夠開始產生聲音。

11. 加強的媒體文件訪問功能

存儲訪問框架 (SAF) 容許應用顯示自定義 DocumentsProvider,後者能夠爲其餘應用提供訪問數據源中的文件的權限。事實上,文檔提供程序甚至能夠提供駐留在網絡存儲區或使用媒體傳輸協議 (MTP)等協議的文件的訪問權限。

可是,訪問遠程數據源中的大媒體文件面臨一些挑戰:

  • 媒體播放器須要以尋址方式訪問來自文檔提供程序的文件。當大媒體文件駐留在遠程數據源上時,文檔提供程序必須事先提取全部數據,並建立快照文件描述符。媒體播放器沒法播放沒有文件描述符的文件,所以在文檔提供程序完成文件下載前,沒法開始播放。

  • 照片應用等媒體集合管理器必須經過做用域文件夾遍歷一系列訪問 URI 才能訪問存儲在外部SD 卡上的媒體。這種訪問模式會讓媒體上的批量操做(例如移動、複製和刪除)變得很是緩慢。

  • 媒體集合管理器沒法根據文檔的 URI肯定其位置。這就讓這些類型的應用難以容許用戶選擇媒體文件的保存位置。 Android 8.0經過改進存儲訪問框架解決了各個挑戰。

##12. 自定義文檔提供程序

Android 8.0開始,存儲訪問框架容許自定義文檔提供程序爲駐留在遠程數據源中的文件建立可尋址的文件描述符。SAF 可打開文件,獲取原生可尋址的文件描述符。而後 SAF向文檔提供程序提交離散字節請求。此功能使文檔提供程序能夠返回媒體播放器應用請求的準確字節範圍,而沒必要事先緩存整個文件。

要使用此功能,您須要調用新的 StorageManager.openProxyFileDescriptor() 函數。openProxyFileDescriptor()函數可接受 ProxyFileDescriptorCallback 對象做爲回調。任什麼時候候,當客戶端應用對文檔提供程序返回的文件描述符執行文件操做時,SAF 都會調用回調。

直接文檔訪問

Android 8.0 開始,您可使用 getDocumentUri() 函數得到與給定 mediaUri 引用相同文檔的 URI。不過,因爲返回的 URIDocumentsProvider提供支持,媒體集合管理器能夠直接訪問文檔,不用遍歷做用域目錄樹。所以,媒體管理器可以以明顯加快的速度對文檔執行文件操做。

注意:getDocumentUri() 函數僅能夠定位媒體文件;沒法授予應用訪問這些文件的權限。要詳細瞭解如何獲取媒體文件的訪問權限,請參閱參考文檔。

文檔路徑

在 Android 8.0 中使用存儲訪問框架時,您能夠根據文檔的 ID,使用 findDocumentPath()函數(存在於 DocumentsContractDocumentsProvider類中)從文件系統的根目錄中肯定路徑。該函數將在 DocumentsContract.Path 對象中返回此路徑。若是文件系統對相同文檔有多個定義的路徑,該函數將返回訪問具備給定 ID 的文檔時最常使用的路徑。

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

  • 您的應用使用能夠顯示特定文檔位置的「另存爲」對話框。

  • 您的應用在搜索結果視圖中顯示文件夾而且若是用戶選擇某個文件夾,應用必須加載此特定文件夾內的子文檔。

注:若是您的應用僅具備路徑中某些文檔的訪問權限,那麼 findDocumentPath() 的返回值將僅包含您的應用能夠訪問的文件夾和文檔。

13. 鏈接

WLAN 感知

Android 8.0 新增了對 WLAN 感知的支持,此技術基於周邊感知聯網 (NAN) 規範。在具備相應 WLAN 感知硬件的設備上,應用和附近設備能夠經過 WLAN 進行搜索和通訊,無需依賴互聯網接入點。咱們正在與硬件合做夥伴合做,以儘快將 WLAN 感知技術應用於設備。要了解有關如何將 WLAN 感知集成到您的應用中的信息,請參閱 WLAN 感知。

藍牙

Android 8.0 經過增長如下功能,加強了平臺對藍牙的支持:

支持 AVRCP 1.4 標準,該標準支持音樂庫瀏覽。 支持藍牙低功耗 (BLE) 5.0 標準。 將 Sony LDAC 編解碼器集成到藍牙堆疊中。

配套設備配對

在嘗試經過藍牙、BLE 和 WLAN 與配套設備配對時,Android 8.0 提供的 API 容許您自定義配對請求對話框。如需瞭解詳細信息,請參閱配套設備配對。

如需瞭解有關在 Android 上使用藍牙的詳細信息,請參閱藍牙指南。有關對藍牙所做的特定於 Android 8.0 的變動,請參閱 Android 8.0 行爲變動頁面的藍牙部分。

#14. 共享

智能共享

Android 8.0 瞭解用戶的個性化分享首選項,在經過哪些應用分享各個類型的內容方面,也有着更好的把握。例如,若是用戶爲一張收據拍照,Android 8.0 能夠建議費用跟蹤應用;若是用戶自拍,一款社交媒體應用能夠更好地處理圖像。Android 8.0 能夠根據用戶的個性化首選項自動學習全部這些模式。

智能分享適用於 image 以外的內容類型,例如 audio、video、text 和 URL 等。

要啓用智能分享,請將具備最多三個字符串註釋的 ArrayList 添加到分享內容的 intent。這些註釋應說明內容中的主要部分或主題。下面的代碼示例顯示瞭如何向 intent 添加註釋:

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

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

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);
複製代碼

如需瞭解有關智能分享註釋的詳細信息,請參閱 EXTRA_CONTENT_ANNOTATIONS。

15. 智能文本選擇

在兼容設備上,Android 8.0 讓應用能夠幫助用戶以更有意義的方式與文本交互。當用戶長按某個實體中可識別格式的單詞(例如某個地址或餐館名稱)時,系統會選中整個實體。用戶會看到一個浮動工具欄,該工具欄包含能夠處理所選文本實體的應用。例如,若是系統識別出某個地址,它能夠將用戶導向地圖應用。

系統識別的實體包括地址、網址、電話號碼和電子郵件地址。如需瞭解詳細信息,請參閱 TextClassifier。

#16. 無障礙功能 Android 8.0 支持開發者使用如下無障礙功能建立本身的無障礙服務。如需瞭解有關如何讓您的應用更便於訪問的更多信息,請參閱無障礙功能。

無障礙功能按鈕

您的無障礙服務如今能夠請求在系統的導航區域顯示無障礙功能按鈕,該按鈕讓用戶可從其設備上的任意位置快速激活您的服務功能。要執行此操做,請在某個 AccessibilityServiceInfo對象的 android:accessibilityFlags屬性中添加 FLAG_REQUEST_ACCESSIBILITY_BUTTON標誌。稍後,您可使用registerAccessibilityButtonCallback()註冊回調。

注:此功能僅適用於提供軟件渲染導航區域的設備。請始終使用isAccessibilityButtonAvailable(),並經過實現 onAvailabilityChanged() 根據無障礙功能按鈕的可用性來響應變動。經過該方式,用戶能夠始終訪問您的服務功能,即便該無障礙功能按鈕不受支持或變得不可用。

17. 獨立的音量調整

Android 8.0 引入了STREAM_ACCESSIBILITY 音量類別,容許您單獨控制無障礙服務音頻輸出的音量,而不會影響設備上的其餘聲音。

要使用這個新的流類型來控制無障礙服務音量,請在無障礙服務中設置 FLAG_ENABLE_ACCESSIBILITY_VOLUME 選項。而後,您可使用adjustStreamVolume()更改設備的無障礙服務音頻音量。

18 .指紋手勢

您的無障礙服務也能夠響應替代的輸入機制,即沿設備的指紋傳感器按特定方向滑動(上、下、左和右)。要接收有關這些交互的回調,請完成如下一系列步驟:

  • 1.聲明 USE_FINGERPRINT 權限和 CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES功能。
    1. android:accessibilityFlags 屬性中設置FLAG_REQUEST_FINGERPRINT_GESTURES `標誌。
    1. 使用registerFingerprintGestureCallback()註冊回調。 請記住,並不是全部設備都包含指紋傳感器。您可使用 isHardwareDetected()函數識別設備是否支持此傳感器。即便對於包含指紋傳感器的設備,您的服務也只有在指紋傳感器不用於身份驗證目的時纔可以使用它。要識別此傳感器什麼時候可用,請調用 isGestureDetectionAvailable()函數並實現 onGestureDetectionAvailabilityChanged() 回調。

19. 字詞級突出顯示

要肯定 TextView對象中可見字符的位置,您能夠在 EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY中將其做爲第一個參數傳遞到 refreshWithExtraData()中。隨後會更新您爲refreshWithExtraData()提供的做爲第二個參數的 Bundle對象,使之包含一個可打包的 Rect對象數組。每一個 Rect 對象表明某個特定字符的邊界框。

若是您的服務使用 TextToSpeech 對象朗讀屏幕上出現的內容,您能夠獲取有關文本到語音轉換引擎什麼時候開始朗讀單個合成字詞時的準確時間信息,前提是文本到語音轉換引擎提供此信息。當引擎即將開始播放特定範圍文本的音頻時,Text-to-Speech API會通知您的服務,將使用 onRangeStart()函數開始朗讀此範圍的文本。

若是您建立本身的 TextToSpeechService 實現,您可使用rangeStart()函數支持這一新功能。

20. 標準化單端範圍值

AccessibilityNodeInfo的一些實例使用 AccessibilityNodeInfo.RangeInfo的某個實例來代表界面元素可接受必定範圍的值。使用 RangeInfo.obtain()建立範圍或使用getMin()getMax() 檢索此範圍的極值時,請注意,Android 8.0 規定了標準化單端範圍:

  • 對於沒有最小值的範圍,Float.NEGATIVE_INFINITY 表示最小值。
  • 對於沒有最大值的範圍,Float.POSITIVE_INFINITY 表示最大值。

21. 提示文本

Android 8.0 包含可用於與文本可編輯對象的提示文本進行交互的多個函數:

  • isShowingHintText() 和 setShowingHintText() 函數分別顯示和設置節點的當前文本內容是否表示節點的提示文本。若是節點不包含可編輯文本,則它不該包含提示文本。
  • 要訪問提示文本自己,請使用 getHintText()。即便某個對象當前未顯示提示文本,系統也能成功調用 getHintText()。

連續的手勢分派

您的服務如今可使用 GestureDescription.StrokeDescription 構造函數中的最後一個參數 willContinue,指定屬於同一設定手勢的筆劃的順序

22. 安全性與隱私

權限

Android 8.0 引入了多個與電話有關的新權限:

  • ANSWER_PHONE_CALLS容許您的應用經過編程方式接聽呼入電話。要在您的應用中處理呼入電話,您可使用 acceptRingingCall()函數。
  • READ_PHONE_NUMBERS 權限容許您的應用讀取設備中存儲的電話號碼。 這些權限均被劃分爲危險類別,屬於 PHONE 權限組。

#23. 新的賬號訪問和 Discovery API

Android 8.0 對應用訪問用戶賬號的方式引入多項改進。對於由身份驗證器管理的賬號,身份驗證器在決定對應用隱藏賬號仍是顯示賬號時可使用本身的策略。Android 系統跟蹤能夠訪問特定賬號的應用。

在之前的 Android 版本中,想要跟蹤用戶賬號列表的應用必須獲取有關全部賬號的更新,包括具備不相關類型的賬號。Android 8.0 添加了 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])函數,其容許應用指定應接收賬號變動的賬號類型列表。

API 變動 AccountManager 提供六個新函數以幫助身份驗證器管理哪些應用能夠查看某個賬號:

  • setAccountVisibility(android.accounts.Account, java.lang.String, int):針對特定用戶賬號和軟件包組合設置可見性級別。
  • getAccountVisibility(android.accounts.Account, java.lang.String):獲取特定用戶賬號和軟件包組合的可見性級別。
  • getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String):容許身份驗證器獲取賬號和給定軟件包的可見性級別。
  • getPackagesAndVisibilityForAccount(android.accounts.Account):容許身份驗證器獲取存儲的給定賬號的可見性值。
  • addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>):容許身份驗證器初始化賬號的可見性值。
  • addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]):將 OnAccountsUpdateListener 偵聽器添加到AccountManager 對象。不管設備上的賬號列表什麼時候發生變化,系統都將調用此偵聽器。 Android 8.0 引入兩個特殊的軟件包名稱值,以使用 setAccountVisibility(android.accounts.Account, java.lang.String, int) 函數指定未設置的應用的可見性級別。PACKAGE_NAME_KEY_LEGACY_VISIBLE可見性值應用於具備 GET_ACCOUNTS權限的應用,而且其目標 Android 版本低於 Android 8.0,或其簽名與針對任意 Android 版本的身份驗證器匹配。PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE爲以前未設置的應用提供默認的可見性值,對於此類應用,PACKAGE_NAME_KEY_LEGACY_VISIBLE 不適用。

如需瞭解有關新的賬號訪問和發現 API 的詳細信息,請參閱 AccountManagerOnAccountsUpdateListener參考。

24. Google Safe Browsing API

WebView 類如今添加了一個Safe Browsing API 來加強網絡瀏覽的安全性。如需瞭解詳細信息,請參閱 Google Safe Browsing API。

25. 測試

儀器測試

Android 8.0 爲應用的儀器測試提供如下幾項額外支持。

針對非默認應用進程運行

如今,您能夠指定針對您的應用的默認進程之外的進程運行特定儀器測試。若是您的應用包含多個在不一樣進程中運行的操做組件,此配置很是有用。

要定義非默認進程儀器測試,請導航至您的清單文件,而後導航至所需的<instrumentation>元素。添加 android:targetProcess屬性,並將它的值設置爲如下值之一:

  • 特定進程的名稱。
  • 以逗號分隔的進程名稱列表。
  • 通配符("*"),容許針對任何執行 android:targetPackage 屬性中指定的軟件包中的代碼的已啓動進程運行儀器測試。 在執行儀器測試時,您能夠經過調用 getProcessName() 檢查正在測試哪一個進程。

在測試過程當中報告結果 如今,經過調用 addResults(),您能夠在執行儀器測試時(而不用等到測試後)報告結果。

用於測試的模擬 Intent

爲了更輕鬆地爲您應用的操做組件建立隔離、獨立的界面測試,Android 8.0 引入了 onStartActivity() 函數。要處理您的測試類調用的特定 intent,您能夠在 Instrumentation.ActivityMonitor 類的自定義子類中替換此函數。

當您的測試類調用 intent 時,該函數將返回一個存根 Instrumentation.ActivityResult 對象,而不是執行 intent 自己。經過在您的測試中使用這種模擬 intent 邏輯,您能夠側重於本身的操做組件如何準備和處理您傳遞到不一樣操做組件或徹底不一樣的應用中的 intent。

26. 運行時和工具

平臺優化

Android 8.0 爲平臺引入了運行時優化和其餘優化,這些優化將帶來多項性能改進。這些優化包括併發壓縮垃圾回收、更有效的內存利用和代碼區域。

它們能夠加快啓動時間,併爲 OS 和應用帶來更好的性能。

更新的 Java 支持

Android 8.0 添加了對更多 OpenJDK Java API 的支持:

  • OpenJDK 8 中的 java.time
  • OpenJDK 7 中的 java.nio.filejava.lang.invoke。 要詳細瞭解這些新添加的軟件包中的類和函數,請參閱 API 參考文檔。

若是您想要在 Android Studio 中使用 Java 8 語言功能,您應下載最新的預覽版本。

更新的 ICU4J Android Framework API Android 8.0 擴展了 ICU4J Android 框架 API—,它是 ICU4J API 的子集—,供應用開發者在 android.icu 軟件包中使用。這些 API 使用設備上具備的本地化數據。所以,您無需在 APK 中編譯 ICU4J 庫,從而減小 APK 佔用空間。

Android 中使用的 ICU、CLDR 和 Unicode 版本

如需詳細瞭解針對受支持的 ICU4J API 的更新,請閱讀版本說明。 #27. Android 企業版 已爲運行 Android 8.0 的設備引入新的企業功能和 API。重要功能包括以下:

徹底託管的設備中的工做資料使企業能夠在管理工做數據與我的數據的同時,將它們分離開來。 API 委派容許設備全部者和我的資料全部者將應用管理分配給其餘應用。 配置流程中的用戶體驗改進措施(包含新的自定義選項)縮短了設置時間。 藍牙、WLAN、備份和安全性方面的新增控制選項使企業能夠更精細地管理設備。網絡操做組件日誌記錄可幫助企業追查問題。 如需詳細瞭解上述及其餘新增 Android 企業版 API 和功能,請參閱企業中的 Android。

至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

若有侵權,請聯繫小編,小編對此深感抱歉,屆時小編會刪除文章,當即中止侵權行爲,請您多多包涵。

既然都看到這裏,領兩個紅包在走吧! 如下兩個紅包天天均可以領取

1.支付寶搜索 522398497,或掃碼支付寶紅包海報。

支付寶掃一掃,天天領取大紅包

2.微信紅包,微信掃一掃便可領取紅包

微信掃一掃,天天領取微信紅包
相關文章
相關標籤/搜索