Android 5.0 主要API概覽

API 級別:21

Android 5.0 (LOLLIPOP) 爲用戶和應用開發者提供了新的功能。本文檔介紹了最值得注意的新 API。

有關新平臺功能的扼要介紹,另請參閱 Android Lollipop 集錦

開始開發

要構建 Android 5.0 版應用,您必須先下載 Android SDK,然後使用 SDK 管理器下載 Android 5.0 SDK 平臺和系統映像。

更新您的目標 API 級別

要進一步針對運行 Android 5.0 的設備優化您的應用,請將 targetSdkVersion 設置爲 "21",在 Android 5.0 系統映像上安裝該應用並予以測試,然後將更改後的新版應用發佈出去。

您既可以使用 5.0 API,也可以支持舊版本,方法是在代碼中構建條件,確保先檢查系統 API 級別再執行 minSdkVersion 不支持的 API。要詳細瞭解有關保持向後兼容的信息,請參閱支持不同平臺版本

要詳細瞭解有關各個 API 級別運行方式的信息,請參閱什麼是 API 級別?

重要的行爲變更


請注意,如果您之前發佈了 Android 版應用,那麼您的應用可能會受到 Android 5.0 變化的影響。

如果您尚未針對新的 Android 運行時 (ART) 測試您的應用…

第 4.4 版引入了一個全新的實驗性功能,即 Android 運行時 (ART)。在第 4.4 版中,ART 是可選的,默認運行時仍爲 Dalvik。對於 Android 5.0,默認運行時現在是 ART。

有關 ART 新功能的概述,請參閱 ART 簡介。主要包括下面的一些新功能:

  • 預先 (AOT) 編譯
  • 經過改進的垃圾回收 (GC)
  • 經過改進的調試支持

大多數 Android 應用應該不用做出任何更改即可直接在 ART 下運行。不過,Dalvik 上運行的部分技術在 ART 上無法運行。要了解最重要的問題,請參閱在 Android 運行時 (ART) 上驗證應用行爲。請特別注意以下情況:

  • 您的應用使用 Java 原生接口 (JNI) 運行 C/C++ 代碼。
  • 您使用的開發工具可生成非標準代碼(例如某些混淆代碼)。
  • 您使用的技術與垃圾回收壓縮不兼容。(雖然 ART 當前沒有實施垃圾回收壓縮,但在 Android 開放源代碼項目中,垃圾回收壓縮正處於開發階段)。

如果您的應用實施通知…

請確保您的通知能夠反映出 Android 5.0 的這些變化。要詳細瞭解如何設計適用於 Android 5.0 及更高版本的通知,請參閱通知設計指南

Material Design 設計樣式

通知是在白色(或顏色非常淺的)背景上繪製的深色文本,以便與新的 Material Design 設計小部件協調一致。請確保所有通知在新的配色方案下都能夠正常顯示。如果通知無法正常顯示,請予以修復:

  • 使用 setColor() 在圖標圖片後面的圓圈中設置一種強調色彩。
  • 更新或移除有顏色的資源。系統會忽略操作圖標和主通知圖標中的所有非 Alpha 通道。您應當假定這些圖標僅包含 Alpha 通道。系統會用白色來繪製通知圖標,而用深灰色來繪製操作圖標。

聲音和振動

如果您當前在使用 RingtoneMediaPlayer 或 Vibrator 類爲通知添加聲音和振動,請移除該代碼,這樣系統才能以優先模式正常呈現通知。若要添加聲音和振動,請改用 Notification.Builder 方法。

將設備設置爲 RINGER_MODE_SILENT 會導致它進入新的優先模式。如果將設備設置爲 RINGER_MODE_NORMAL 或RINGER_MODE_VIBRATE,則會使其退出優先模式。

以前,Android 將 STREAM_MUSIC 用作主音量流,以此來控制平板電腦設備的音量。在 Android 5.0 中,手機和平板電腦設備的主音量流現已統一,均由 STREAM_RING 或 STREAM_NOTIFICATION 控制。

通知在鎖定屏幕上的公開程度

在 Android 5.0 中,通知現在默認顯示在用戶的鎖定屏幕上。用戶可以選擇不公開敏感信息,這樣的話系統會自動修改通知顯示文本。要自定義這種經過修改的通知,請使用 setPublicVersion()

如果通知不包含個人信息,或者您希望在通知中顯示媒體播放控件,請調用 setVisibility() 方法,並將通知的公開程度的級別設置爲 VISIBILITY_PUBLIC

媒體播放

如果您要實施可呈現媒體播放狀態或傳輸控件的通知,請考慮使用新的 Notification.MediaStyle 模板,而不是自定義RemoteViews.RemoteView 對象。無論您選擇使用哪種方法,請務必將通知的公開程度設置爲 VISIBILITY_PUBLIC,以便用戶可以在鎖定屏幕中使用您的控件。請注意,從 Android 5.0 開始,系統不再在鎖定屏幕中顯示 RemoteControlClient 對象。有關詳情,請參閱如果您的應用使用 RemoteControlClient

提醒通知

現在,當設備處於活動狀態(即設備未鎖定且屏幕亮起)時,通知可以顯示在小型浮動窗口中(也稱爲提醒通知)。此類通知採用的顯示形式與緊湊型通知採用的形式類似,不同的是提醒通知還會顯示操作按鈕。用戶無需退出當前應用,即可根據提醒通知執行操作或關閉提醒通知。

可以觸發提醒通知的情景示例包括:

  • 用戶在全屏模式下執行操作(應用使用 fullScreenIntent
  • 通知的優先級較高,並且使用鈴聲或振動

如果您的應用在上述任意一種情景下實施通知,請確保提醒通知能夠正常呈現。

如果您的應用使用 RemoteControlClient…

RemoteControlClient 類現已被棄用。請儘快改用全新的 MediaSession API。

對於 MediaSession 或 RemoteControlClient,Android 5.0 中的鎖定屏幕不會顯示傳輸控件。相反,您的應用可以通過通知在鎖定屏幕中提供媒體播放控件。這樣,您的應用就能夠更好地控制媒體按鈕的展現方式,同時還能讓用戶無論在設備處於鎖定還是解鎖狀態下都可以執行同樣的操作。

爲此,Android 5.0 引入了一個新的 Notification.MediaStyle 模板。Notification.MediaStyle 將您通過Notification.Builder.addAction() 添加的通知操作轉換到在您應用的媒體播放通知中內嵌的緊湊型按鈕中。將會話令牌傳遞到 setSession() 方法,指示系統此通知控制正在進行的媒體會話。

請務必將通知的公開程度設置爲 VISIBILITY_PUBLIC,將通知標爲安全通知,以便在任何鎖定屏幕(安全屏幕或其他屏幕)上顯示。有關詳情,請參閱在鎖定屏幕上顯示通知

如果您的應用是在 Android TV 或 Wear 平臺上運行,請通過實施 MediaSession 類來顯示媒體播放控件。如果您的應用需要在 Android 設備上接收媒體按鈕事件,您還應當實施 MediaSession

如果您的應用使用 getRecentTasks()…

由於 Android 5.0 中引入了並行文檔和活動任務這一新功能(請參閱下文中的“最近用過”屏幕中的並行文檔和活動),ActivityManager.getRecentTasks() 方法現已被棄用,以更好地保護用戶隱私。爲了實現向後兼容性,此方法仍會返回它的一小部分數據,包括調用應用自身的任務,同時還可能包括其他一些非敏感任務(例如“首頁”)。如果您的應用在使用此方法檢索它自身的任務,請改用 getAppTasks() 檢索該信息。

如果您使用的是 Android 原生開發工具包 (NDK)…

Android 5.0 支持 64 位系統。64 位增強功能增加了尋址空間並提高了性能,同時仍能全面支持現有的 32 位應用。64 位支持還提高了 OpenSSL 的加密性能。另外,此版本還引入了新的原生媒體 NDK API 以及原生 OpenGL ES (GLES) 3.1 支持。

要利用 Android 5.0 中提供的 64 位支持,請從 Android NDK 頁面下載並安裝 NDK 10c 版。要詳細瞭解 NDK 的重要變化和錯誤修復,請參閱 10c 版版本說明

如果您的應用綁定到某項服務…

Context.bindService() 方法現在要求獲取顯式 Intent;如果獲取的是隱式 intent,則會引發異常。爲了確保您的應用是安全的,請在啓動或綁定 Service 時使用顯式 intent,並且不要爲此服務聲明 intent 過濾器。

如果您的應用使用 WebView…

Android 5.0 會更改您應用的默認行爲。

  • 如果您的應用的目標 API 級別不低於 21
  • 如果您的應用的目標 API 級別低於 21:系統不會屏蔽混合內容和第三方 Cookie,並且始終會一次性呈現整個文檔。

界面


Material Design 設計支持

即將發佈的版本新增了對 Android 新 Material Design 設計樣式的支持。您可以藉助 Material Design 設計樣式創建應用,使其呈現動態的視覺效果併爲用戶提供自然的界面元素過渡效果。此支持包括:

  • 素材主題背景
  • 視圖陰影
  • RecyclerView 小部件
  • 可繪製的動畫和樣式效果
  • Material Design 設計動畫和活動過渡效果
  • 基於視圖狀態的視圖屬性動畫生成器
  • 可自定義的界面小部件和應用欄(含您可以控制的調色板)
  • 基於 XML 矢量圖形的動畫和非動畫圖形內容

要詳細瞭解如何向您的應用添加 Material Design 設計功能,請參閱 Material Design 設計

“最近用過”屏幕中的並行文檔和活動

在以前的版本中,對於用戶最近與之互動的每個應用,“最近用過”屏幕都只能顯示一個任務。現在,您的應用可以視需要針對其他並行活動或文檔打開多個任務。通過此功能,用戶可以在“最近用過”屏幕中快速切換各個活動和文檔,並能在所有應用之間獲得一致的切換體驗,從而實現多任務處理。此類並行任務示例可能包括:網絡瀏覽器應用中打開的標籤頁、效率類應用中的文檔、遊戲中的並行對局或信息應用中的聊天。您的應用可以通過 ActivityManager.AppTask 類管理任務。

要插入邏輯中斷,以便系統能夠將您的活動視爲一個新任務,請在通過 startActivity() 啓動活動時使用FLAG_ACTIVITY_NEW_DOCUMENT。您還可以在清單中將 <activity> 元素的 documentLaunchMode 屬性設置爲 "intoExisting" 或"always",從而實現該行爲。

爲了避免“最近用過”屏幕過於混亂,您可以設置應用能夠在該屏幕中顯示的任務數上限。爲此,請設置 <application> 的android:maxRecents 屬性。目前可以指定的上限爲,每個用戶 50 個任務(對於 RAM 較小的設備,則爲每個用戶 25 個任務)。

您可以將“最近用過”屏幕中的任務設置爲在重新啓動過程中保持不變。要控制這一持續行爲,請使用android:persistableMode 屬性。您也可以通過調用 setTaskDescription() 方法,來更改“最近用過”屏幕中活動的視覺屬性,如活動的顏色、標籤和圖標。

WebView 更新

Android 5.0 將 WebView 實施更新爲 Chromium M37,不僅提高了安全性和穩定性,還修復了多項錯誤。Android 5.0 上運行的 WebView 的默認用戶代理字符串已更新爲採用 37.0.0.0 作爲版本號。

此版本引入了 PermissionRequest 類,該類允許您的應用 getUserMedia() 之類的 Web API 向 WebView 授予對受保護資源(例如攝像頭和麥克風)的訪問權限。您的應用必須擁有對這些資源的相應 Android 權限,才能向 WebView 授予權限。

藉助新的 onShowFileChooser() 方法,您現在不但可以在 WebView 中使用輸入表單字段,而且可以啓動文件選擇器從 Android 設備中選擇圖片和文件。

另外,此版本還支持 WebAudioWebGL 和 WebRTC 等開放標準。要詳細瞭解此版本中的新增功能,請參閱Android 版 WebView

屏幕截圖和共享

通過 Android 5.0,您可以使用新的 android.media.projection API 向您的應用添加屏幕截圖和屏幕共享功能。例如,如果您希望在視頻會議應用中啓用屏幕共享,則會發現此功能非常實用。

通過新的 createVirtualDisplay() 方法,您的應用可以將主屏幕內容(默認顯示屏)捕獲到 Surface 對象中,然後通過網絡發送該對象。該 API 僅允許捕獲非安全的屏幕內容,不允許捕獲系統音頻。要開始屏幕截圖,您的應用必須先使用通過createScreenCaptureIntent() 方法獲取的 Intent 啓動屏幕截圖對話框,來請求用戶向其授予相應權限。

有關新 API 的使用示例,請參閱示例項目中的 MediaProjectionDemo 類。

通知


鎖定屏幕通知

Android 5.0 中的鎖定屏幕能夠呈現通知。用戶可以通過“設置”來選擇是否允許在安全的鎖定屏幕上顯示敏感的通知內容。

您的應用可以控制其通知在安全的鎖定屏幕上顯示時的具體公開程度。要控制公開程度的級別,請調用 setVisibility() 並指定下列值之一:

如果公開程度級別爲 VISIBILITY_PRIVATE,您還可以提供隱藏了個人詳細信息的通知內容修改版本。例如,短信應用的通知可能會顯示“您有 3 條新短信”,但隱藏短信內容和發送者。要提供此備用通知,請先使用 Notification.Builder 創建替代通知。當創建不公開的通知對象時,請通過 setPublicVersion() 方法爲其附加替代通知。

通知元數據

Android 5.0 使用與您的應用通知關聯的元數據更智能地對通知進行排序。要設置元數據,請在構建通知時調用Notification.Builder 中的以下方法:

  • setCategory():告訴系統當設備處於“優先”模式時如何處理您的應用通知(例如,當通知表示來電、即時消息或警報時)。
  • setPriority():將通知標記爲重要性高於或低於普通通知。如果還帶有聲音或振動,則優先級字段設置爲 PRIORITY_MAX或 PRIORITY_HIGH 的通知將出現在一個小的浮動窗口中。
  • addPerson():允許您向通知添加一個或多個相關的人員。利用此方法,您的應用可指示系統將來自指定人員的通知歸成一組,或者將來自這些人員的通知歸類爲重要性高於普通通知。

顯卡


支持 OpenGL ES 3.1

Android 5.0 針對 OpenGL ES 3.1 添加了 Java 接口和原生支持。OpenGL ES 3.1 中提供的主要新功能包括:

  • 對着色器進行計算
  • 單獨的着色器對象
  • 間接繪圖命令
  • 多樣本和模版紋理
  • 對着色語言的改進
  • 用於高級混合模式和調試的擴展
  • 對 OpenGL ES 2.0 和 3.0 的向後兼容性

Android 上 OpenGL ES 3.1 的 Java 接口是通過 GLES31 提供的。當使用 OpenGL ES 3.1 時,請務必在您的清單文件中使用 標記和 android:glEsVersion 屬性聲明它。例如:

<span class="tag" style="color: rgb(0, 0, 136);"><manifest></span><span class="pln" style="color: rgb(0, 0, 0);">
    </span><span class="tag" style="color: rgb(0, 0, 136);"><uses-feature</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:glEsVersion</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"0x00030001"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">/></span><span class="pln" style="color: rgb(0, 0, 0);">
    ...
</span><span class="tag" style="color: rgb(0, 0, 136);"></manifest></span>

有關使用 OpenGL ES 的更多信息,包括如何在運行時檢查設備支持的 OpenGL ES 版本,請參閱 OpenGL ES API 指南

Android 擴展程序包

除了 OpenGL ES 3.1 之外,本版本還提供了一個擴展程序包,該程序包具有適用於高級顯卡功能的 Java 接口和原生支持。Android 將這些擴展程序視爲一個程序包。(如果存在 ANDROID_extension_pack_es31a 擴展程序,則您的應用可以假定該程序包中的所有擴展都存在,並可通過單個 #extension 語句啓用着色語言功能。)

該擴展程序包支持:

  • 對着色器存儲緩衝區、圖片和原子的有保證片段着色器支持(片段着色器支持在 OpenGL ES 3.1 中是可選的。)
  • 曲面細分和幾何着色器
  • ASTC (LDR) 紋理壓縮格式
  • 按樣本插值和着色
  • 爲幀緩衝區中的每個顏色附件使用不同的混合模式

該擴展程序包的 Java 接口是通過 GLES31Ext 提供的。在您的應用清單中,您可以聲明您的應用必須僅安裝在支持該擴展程序包的設備上。例如:

<span class="tag" style="color: rgb(0, 0, 136);"><manifest></span><span class="pln" style="color: rgb(0, 0, 0);">
    </span><span class="tag" style="color: rgb(0, 0, 136);"><uses-feature</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:name</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">“android.hardware.opengles.aep”</span><span class="pln" style="color: rgb(0, 0, 0);">
        </span><span class="atn" style="color: rgb(136, 34, 136);">android:required</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"true"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">/></span><span class="pln" style="color: rgb(0, 0, 0);">
    ...
</span><span class="tag" style="color: rgb(0, 0, 136);"></manifest></span>

媒體


用於高級攝像頭功能的攝像頭 API

Android 5.0 引入了新的 android.hardware.camera2 API 來幫助執行精細的照片拍攝和圖片處理。您現在可以通過getCameraIdList() 以編程方式訪問可供系統使用的攝像頭設備,並通過 openCamera() 連接到特定設備。要開始拍攝圖片,請創建一個 CameraCaptureSession 並指定 Surface 對象來發送所拍攝的圖片。您可以將 CameraCaptureSession 配置爲單拍或連拍。

要想在拍攝了新圖片時收到通知,請實施 CameraCaptureSession.CaptureCallback 監聽器並將其設置在您的拍攝請求中。現在,當系統完成圖片拍攝請求時,您的 CameraCaptureSession.CaptureCallback 監聽器將收到對 onCaptureCompleted() 的調用,在 CaptureResult 中向您提供圖片拍攝元數據。

CameraCharacteristics 類允許您的應用檢測設備上有哪些攝像頭功能可用。對象的 INFO_SUPPORTED_HARDWARE_LEVEL 屬性表示攝像頭的功能級別。

要了解如何使用更新後的攝像頭 API,請參考本版本中的 Camera2Basic 和 Camera2Video 實施樣本。

音頻播放

此版本對 AudioTrack 進行了以下更改:

  • 您的應用現在能夠以浮點格式 (ENCODING_PCM_FLOAT) 提供音頻數據。這允許更大的動態範圍、更一致的精度以及更大的動態餘量。浮點算法在中間計算期間尤其有用。播放端點爲音頻數據使用整數格式,並且具有較低的位深度。(在 Android 5.0 中,內部管線的某些部分尚未採用浮點格式。)
  • 您的應用現在可以將音頻數據提供爲 ByteBuffer,所用格式與 MediaCodec 提供的格式相同。
  • WRITE_NON_BLOCKING 選項可以簡化某些應用的緩衝和多線程處理。

媒體播放控件

使用新的通知和媒體 API,可確保系統界面能夠了解您的媒體播放並提取和顯示專輯封面。而藉助新的 MediaSession 和MediaController 類,您現在則可更輕鬆地跨界面和服務控制媒體播放。

新的 MediaSession 類替代了被棄用的 RemoteControlClient 類,並且提供了一組用於處理傳輸控件和媒體按鈕的回調方法。如果您的應用提供媒體播放並且在 Android TV 或 Wear 平臺上運行,請使用 MediaSession 類和相同的回調方法來處理您的傳輸控件。

您現在可以通過新的 MediaController 類構建您自己的媒體控制器應用。此類提供了一種線程安全方法,可讓您通過自己的應用界面流程來監控媒體播放。在創建控制器時,請指定一個 MediaSession.Token 對象,以便您的應用可以與給定的MediaSession 進行互動。通過使用 MediaController.TransportControls 方法,您可以發送諸如 play()stop()skipToNext()和 setRating() 之類的命令來控制該會話中的媒體播放。創建好控制器之後,您還可以註冊一個 MediaController.Callback 對象來監聽該會話中的元數據和狀態更改。

此外,您還可以通過新的 Notification.MediaStyle 類創建允許將播放控件關聯到媒體會話的豐富通知。

媒體瀏覽

Android 5.0 通過新的 android.media.browse API 引入了允許應用瀏覽其他應用的媒體內容庫的功能。要公開您的應用中的媒體內容,請擴展 MediaBrowserService 類。您的 MediaBrowserService 實施應當提供對 MediaSession.Token 的訪問權限,以便應用可以播放通過您的服務提供的媒體內容。

要與媒體瀏覽器服務進行互動,請使用 MediaBrowser 類。在創建 MediaBrowser 實例時,請爲 MediaSession 指定組件名稱。然後,您的應用可以使用該瀏覽器實例連接到關聯的服務,並獲取 MediaSession.Token 對象來播放通過該服務公開的內容。

存儲


目錄選擇

Android 5.0 對存儲訪問框架進行了擴展,允許用戶選擇整個目錄子樹,並嚮應用授予對其中包含的所有文檔的讀/寫訪問權限(無需請求用戶逐項確認)。

要選擇目錄子樹,請構建併發送 OPEN_DOCUMENT_TREE intent。系統將顯示支持子樹選擇的所有 DocumentsProvider 實例,允許用戶進行瀏覽並選擇目錄。返回的 URI 表示對所選子樹的訪問權限。然後,您可以使用 buildChildDocumentsUriUsingTree()和 buildDocumentUriUsingTree() 以及 query() 來深入瞭解此子樹。

新的 createDocument() 方法允許您在子樹下的任何位置創建新的文檔或目錄。要管理現有文檔,請使用 renameDocument() 和deleteDocument()。在發出這些調用之前,請檢查 COLUMN_FLAGS 以驗證服務提供方是否支持這些調用。

如果您在實施 DocumentsProvider 並希望支持子樹選擇,請實施 isChildDocument() 並在您的 COLUMN_FLAGS 中添加FLAG_SUPPORTS_IS_CHILD

Android 5.0 還在共享的存儲空間內引入了程序包專用的新目錄,您的應用可將要添加到 MediaStore 中的媒體文件放置在這些目錄中。新的 getExternalMediaDirs() 將返回這些目錄在所有共享的存儲設備上的路徑。與 getExternalFilesDir() 類似,您的應用不需要額外的權限即可訪問所返回的路徑。平臺將定期掃描這些目錄中的新媒體,但您也可使用MediaScannerConnection 對新內容進行顯式掃描。

無線和連接


多個網絡連接

Android 5.0 提供了新的多網絡 API,它們允許您的應用動態掃描具有特定功能的可用網絡,然後與這些網絡建立連接。如果您的應用需要一個專用網絡(例如 SUPL、MMS 或運營商計費的網絡),或者如果您希望使用某種特定類型的傳輸協議來發送數據,則此功能非常有用。

要從您的應用動態選擇並連接到某個網絡,請執行以下步驟:

  1. 創建一個 ConnectivityManager
  2. 使用 NetworkRequest.Builder 類創建一個 NetworkRequest 對象並指定您的應用感興趣的網絡功能和傳輸類型。
  3. 要掃描合適的網絡,請調用 requestNetwork() 或 registerNetworkCallback(),並傳入 NetworkRequest 對象和一個ConnectivityManager.NetworkCallback 實施。如果希望在檢測到合適的網絡後主動切換到該網絡,請使用requestNetwork() 方法;如果希望僅接收網絡掃描結果通知而不主動切換,請使用 registerNetworkCallback() 方法。

當系統檢測到合適的網絡時,它將連接到該網絡並調用 onAvailable() 回調。您可以在回調中使用 Network 對象來獲取關於該網絡的更多信息,或者指示通信使用選定的網絡。

低功耗藍牙

Android 4.3 中作爲重頭戲引入了對低功耗藍牙(“低功耗藍牙”)的平臺支持。在 Android 5.0 中,Android 設備現在可以用作低功耗藍牙外圍設備。應用可以使用此功能使附近的設備知道它的存在。例如,您可以構建相應的應用來允許設備用作計步器或健康檢測器並與另一低功耗藍牙設備交換其數據。

新的 android.bluetooth.le API 允許您的應用對公告進行廣播,掃描響應,以及與附近的低功能藍牙設備建立連接。要使用新的公告和掃描功能,請在您的清單中添加 BLUETOOTH_ADMIN 權限。當用戶從 Play 商店更新或下載您的應用時,會要求他們向您的應用授予以下權限:“藍牙連接信息:允許應用控制藍牙,包括向附近的藍牙設備進行廣播以及獲取關於這些設備的信息。”

要開始低功耗藍牙公告以便其他設備可以發現您的應用,請調用 startAdvertising() 並傳入 AdvertiseCallback 類的一個實施。回調對象將收到關於公告操作成功或失敗的報告。

Android 5.0 引入了 ScanFilter 類,以便您的應用可以僅掃描它感興趣的特定類型的設備。要開始掃描低功耗藍牙設備,請調用 startScan() 並傳入一個過濾器列表。在該方法調用中,您還必須提供 ScanCallback 的一個實施以便在發現低功耗藍牙公告時進行報告。

NFC 增強功能

Android 5.0 添加了以下增強功能以實現更廣泛和更靈活的 NFC 使用:

  • “分享”菜單中現在提供了 Android Beam。
  • 您的應用可以通過調用 invokeBeam() 在用戶的設備上調用 Android Beam 來分享數據。這不需要用戶對着另一個具有 NFC 功能的設備手動點按設備即可完成數據傳輸。
  • 您可以使用新的 createTextRecord() 方法來創建包含 UTF-8 文本數據的 NDEF 記錄。
  • 如果您在開發支付應用,則您現在能夠通過調用 registerAidsForService() 動態註冊 NFC 應用 ID (AID)。您還可以使用setPreferredService() 設置當某個特定的活動處於前臺時應當使用的首選卡仿真服務。

Project Volta


除了新功能之前,Android 5.0 還重點對電池壽命進行了改進。可以使用新的 API 和工具來了解並優化您的應用的功耗。

調度作業

Android 5.0 提供了一個新的 JobScheduler API,它允許您通過爲系統定義要在以後的某個時間或在指定的條件下(例如,當設備在充電時)異步運行的作業來優化電池壽命。作業調度在下列情況下非常有用:

  • 應用具有您可以推遲的非面向用戶的工作。
  • 應用具有當插入設備時您希望優先執行的工作。
  • 應用具有需要訪問網絡或 Wi-Fi 連接的任務。
  • 應用具有您希望作爲一個批次定期運行的許多任務。

工作單元由一個 JobInfo 對象進行封裝。此對象指定了調度條件。

使用 JobInfo.Builder 類配置調度的任務應當如何運行。您可以將任務調度爲在特定的條件下運行,例如:

  • 當設備充電時啓動
  • 當設備連接到不限流量網絡時啓動
  • 當設備空閒時啓動
  • 在特定的截止期限之前或以最小的延遲完成

例如,您可以添加如下代碼以在不限流量網絡上運行您的任務:

<span class="typ" style="color: rgb(102, 0, 102);">JobInfo</span><span class="pln" style="color: rgb(0, 0, 0);"> uploadTask </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">new</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">JobInfo</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Builder</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">mJobId</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);">
                                         mServiceComponent </span><span class="com">/* JobService component */</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);">
        </span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">setRequiredNetworkCapabilities</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">JobInfo</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">NetworkType</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">UNMETERED</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);">
        </span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">build</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln" style="color: rgb(0, 0, 0);">
</span><span class="typ" style="color: rgb(102, 0, 102);">JobScheduler</span><span class="pln" style="color: rgb(0, 0, 0);"> jobScheduler </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln" style="color: rgb(0, 0, 0);">
        </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">JobScheduler</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> context</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">getSystemService</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">Context</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">JOB_SCHEDULER_SERVICE</span><span class="pun" style="color: rgb(102, 102, 0);">);</span><span class="pln" style="color: rgb(0, 0, 0);">
jobScheduler</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">schedule</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">uploadTask</span><span class="pun" style="color: rgb(102, 102, 0);">);</span>

如果設備具有穩定的電源(也就是說,它已插入了 2 分鐘以上並且電池處於健康水平),則系統將運行任何已就緒可運行的已調度作業,即使作業的截止期限尚未到期也是如此。

要查看有關如何使用 JobScheduler API 的示例,請參考本版本中的 JobSchedulerSample 實施樣本。

用於查詢耗電量信息的開發者工具

新的 dumpsys batterystats 命令將生成關於設備上耗電量信息的有趣統計數據,該數據按唯一用戶 ID (UID) 進行組織。該統計信息包括:

  • 與電池相關的事件的歷史記錄
  • 設備的全局統計信息
  • 每個 UID 和系統組件的大致用電量
  • 每個數據包的每個手機應用毫秒數
  • 系統 UID 彙總統計信息
  • 應用 UID 彙總統計信息

可使用 --help 選項瞭解用於對輸出進行自定義的各種選項。例如,要輸出自設備上次充電後給定應用包的耗電量統計信息,請運行以下命令:

<span class="pln" style="color: rgb(0, 0, 0);">$ adb shell dumpsys batterystats </span><span class="pun" style="color: rgb(102, 102, 0);">--</span><span class="pln" style="color: rgb(0, 0, 0);">charged </span><span class="pun" style="color: rgb(102, 102, 0);"><</span><span class="kwd" style="color: rgb(0, 0, 136);">package</span><span class="pun" style="color: rgb(102, 102, 0);">-</span><span class="pln" style="color: rgb(0, 0, 0);">name</span><span class="pun" style="color: rgb(102, 102, 0);">></span>

您可以對 dumpsys 命令的輸出使用 Battery Historian 工具從日誌中生成與電量相關的事件的 HTML 可視形式。此信息使您可以更輕鬆地瞭解和診斷任何與電池相關的問題。

辦公場所和教育環境中的 Android


託管配置

Android 5.0 提供了用於在企業環境內運行應用的新功能。如果用戶具有現有的個人帳戶,則設備管理員可以啓動託管配置流程來向設備添加一個共存但單獨的“託管配置文件”。與託管配置文件關聯的應用將與非託管應用一起出現在用戶的啓動器、“最近用過”屏幕以及通知中。

要啓動託管配置流程,請在 Intent 中發送 ACTION_PROVISION_MANAGED_PROFILE。如果調用成功,則系統將觸發onProfileProvisioningComplete() 回調。然後,您可以調用 setProfileEnabled() 來啓用此託管配置文件。

默認情況下,在託管配置文件中只會啓用一小部分應用。您可以通過調用 enableSystemApp() 在託管配置文件中安裝額外的應用。

如果您在開發啓動器應用,則可以使用新的 LauncherApps 類來獲取當前用戶的可啓動活動的列表以及任何關聯的託管配置文件。您的啓動器可以通過向圖標繪圖添加一個工作標記,使託管應用更加惹人注目。要檢索帶標記的圖標,請調用getUserBadgedIcon()

要查看如何使用此新功能,請參考本版本中的 BasicManagedProfile 實施樣本。

設備所有者

Android 5.0 引入了部署設備所有者應用的功能。“設備所有者”是一類特殊的設備管理員,具有在設備上創建和移除輔助用戶以及配置全局設置的額外能力。您的設備所有者應用可以使用 DevicePolicyManager 類中的方法來對託管設備上的配置、安全性和應用進行精細控制。一個設備在任一時刻只能有一個處於活動狀態的設備所有者。

要部署並激活設備所有者,您必須在設備處於未配置狀態時執行從編程應用到設備的 NFC 數據傳輸。此數據傳輸發送的信息與託管配置中描述的配置 intent 中的信息相同。

屏幕固定

Android 5.0 引入了一個新的屏幕固定 API,它允許您暫時防止用戶離開您的任務或被通知打擾。例如,如果您在開發一個教育應用以在 Android 或單用途或資訊服務應用上支持高風險評估需求,則可以使用此功能。一旦您的應用激活了屏幕固定,則用戶將無法看到通知、訪問其他應用或者返回到主屏幕,直到您的應用退出該模式。

有兩種方法用來激活屏幕固定:

  • 手動:用戶可以在“設置”>“安全性”>“屏幕固定”中啓用屏幕固定,並通過在“最近用過”屏幕上點觸屏幕固定圖標來選擇他們要固定的任務。
  • 以編程方式:要以編程方式激活屏幕固定,請在您的應用中調用 startLockTask()。如果請求方應用不是設備所有者,則會提示用戶確認。設備所有者應用可以調用 setLockTaskPackages() 方法來使應用成爲可固定的,不需要經歷用戶確認步驟。

當任務鎖定處於活動狀態時,會發生以下行爲:

  • 狀態欄爲空,並且用戶通知和狀態信息被隱藏。
  • 首頁和“最近的應用”按鈕被隱藏。
  • 其他應用無法啓動新活動。
  • 當前應用可以啓動新活動,只要這樣做不會創建新任務即可。
  • 當屏幕固定是由設備所有者調用的時,用戶將保持鎖定到您的應用,直到該應用調用 stopLockTask()
  • 如果屏幕固定是由設備所有者之外另一應用或者是由用戶直接調用的活動時,用戶可以通過同時按住“返回”和“最近”按鈕退出。

打印框架


使用位圖來呈現 PDF 文件

您現在可以使用新的 PdfRenderer 類將 PDF 文檔頁呈現爲位圖圖片以便打印。您必須指定系統將可打印內容寫入其中的一個可查找的(也就是說,可以隨機訪問內容)ParcelFileDescriptor。您的應用可以通過 openPage() 獲取頁面進行呈現,然後調用 render() 將已打開的 PdfRenderer.Page 轉變爲位圖。如果您只希望將文檔的一部分轉變爲位圖圖片(例如,要實施平鋪渲染以放大文檔),則還可以設置其他參數。

有關如何使用新 API 的示例,請參閱 PdfRendererBasic 樣本。

系統


應用使用情況統計信息

您現在可以通過新的 android.app.usage API 訪問 Android 設備上的應用使用情況歷史記錄。此 API 提供了比被棄用的getRecentTasks() 方法更詳細的使用情況信息。要使用此 API,必須先在您的清單中聲明"android.permission.PACKAGE_USAGE_STATS" 權限。用戶還必須通過“設置”>“安全性”>“應用”使用“使用情況訪問”啓用對此應用的訪問權限。

系統將以每個應用爲單位收集使用情況數據,並按每天、每週、每月和每年時間間隔對數據進行彙總。系統保留此數據的最大持續時間如下所述:

  • 每天數據:7 天
  • 每週數據:4 周
  • 每月數據:6 個月
  • 每年數據:2 年

對於每個應用,系統將記錄以下數據:

  • 上次使用應用的時間
  • 應用在該時間間隔內(按天、周、月或年)處於前臺的總時間長度
  • 組件(由程序包和活動名稱予以標識)在一天中移動到前臺或後臺時的時間戳捕獲
  • 設備配置更改時(例如當設備配置因爲旋轉而更改時)的時間戳捕獲

測試和輔助功能


測試和輔助功能改進

Android 5.0 對測試和輔助功能增加了以下支持:

  • 新的 getWindowAnimationFrameStats() 和 getWindowContentFrameStats() 方法將捕獲窗口動畫和內容的幀統計信息。這些方法允許您編寫儀器測試來評估某個應用是否在以足夠的刷新頻率來呈現幀以提供流暢的用戶體驗。
  • 新的 executeShellCommand() 方法允許您通過儀器測試執行 shell 命令。命令執行類似於從連接到設備的主機運行 adb shell,允許您使用基於 shell 的工具,例如 dumpsysam content 和 pm
  • 使用輔助功能 API(例如 UiAutomator)的輔助服務和測試工具現在可以檢索有視力的用戶可以與之進行互動的屏幕上窗口的屬性的詳細信息。要檢索 AccessibilityWindowInfo 對象的列表,請調用新的 getWindows() 方法。
  • 新的 AccessibilityNodeInfo.AccessibilityAction 類允許您定義可以對 AccessibilityNodeInfo 執行的標準或自定義操作。新的 AccessibilityNodeInfo.AccessibilityAction 類替換了以前在 AccessibilityNodeInfo 中提供的與操作相關的 API。
  • Android 5.0 對您的應用中的文本到語音合成提供了更細粒度的控制。新的 Voice 類允許您的應用使用與特定區域設置、質量和延遲評級以及特定於文本到語音引擎的參數關聯的語音配置文件。

IME


更輕鬆地在輸入語言之間切換

從 Android 5.0 開始,用戶可以更輕鬆地在該平臺支持的所有輸入法編輯器 (IME) 之間進行切換。執行指定的切換操作(通常是觸摸軟鍵盤上的一個地球圖標)將循環經過所有此類 IME。此行爲更改是由 shouldOfferSwitchingToNextInputMethod()方法實施的。

此外,框架現在還將檢查下一個 IME 究竟是否包括切換機制(並因此檢查該 IME 是否支持切換到它之後的 IME)。具有切換機制的 IME 不會切換到沒有切換機制的 IME。此行爲更改是由 switchToNextInputMethod() 方法實施的。

要查看有關如何使用更新的 IME 切換 API 的示例,請參考本版本中更新的軟鍵盤實施樣本。要詳細瞭解如何實施 IME 切換,請參閱創建輸入法

清單聲明


聲明必需的功能

 元素中現在支持下列值,因此,您可以確保您的應用僅安裝在提供了您的應用所需功能的設備上。

用戶權限

 元素中現在支持以下權限來聲明您的應用訪問特定 API 時所需的權限。

  • BIND_DREAM_SERVICE:當針對 API 級別 21 和更高級別時,Daydream 服務需要此權限來確保只有系統可以綁定到它。

上文來自: Android官網:點擊打開鏈接
發佈了24 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章