Android 4.4 API

API 級別:19

Android 4.4 (KITKAT) 是 Android 平台的新版本,可為使用者和應用程式開發人員提供新功能。本文件將介紹最重要的新 API。

應用程式開發人員應盡快透過 SDK Manager 下載 Android 4.4 系統映像檔和 SDK 平台。如果您沒有搭載 Android 4.4 的裝置可以測試應用程式,請使用 Android 4.4 系統映像檔在 Android 模擬器上測試應用程式。然後針對 Android 4.4 平台建構應用程式,開始使用最新的 API。

更新目標 API 級別

如要針對搭載 Android 4.4 的裝置最佳化應用程式,您應將 targetSdkVersion 設為 "19",在 Android 4.4 系統映像檔上安裝、進行測試,再透過這項變更發布更新。

如要在 Android 4.4 中使用 API,同時支援舊版,只要在程式碼中新增條件,即可在執行 minSdkVersion 不支援的 API 之前檢查系統 API 級別。如要進一步瞭解如何維持回溯相容性,請參閱支援不同平台版本

如要進一步瞭解 API 級別的運作方式,請參閱「什麼是 API 級別?」一文。

重要行為變更

請注意,如果您先前發布了 Android 應用程式,請注意您的應用程式可能會受到 Android 4.4 版的異動影響。

如果應用程式從外部儲存空間讀取資料...

在 Android 4.4 版本上執行時,除非應用程式擁有 READ_EXTERNAL_STORAGE 權限,否則應用程式無法讀取外部儲存空間中的共用檔案。也就是說,如果沒有取得權限,就無法存取 getExternalStoragePublicDirectory() 所傳回目錄中的檔案。不過,如果只需要存取 getExternalFilesDir() 提供的應用程式特定目錄,則不需要 READ_EXTERNAL_STORAGE 權限。

如果應用程式使用 WebView...

在 Android 4.4 版本上執行應用程式時,應用程式行為可能會不同,尤其是將應用程式的 targetSdkVersion 更新為「19」以上時。

WebView 類別的基礎程式碼和相關 API 已根據 Chromium 原始碼的新型快照升級。不僅能提升效能、支援新的 HTML5 功能,還支援遠端對 WebView 內容偵錯。這項升級的範圍表示應用程式使用 WebView,在某些情況下可能會受到影響。雖然只有在您將應用程式的 targetSdkVersion 更新為「19」以上時,系統才會記錄已知行為變更,並且僅會對您的應用程式造成影響,但新版 WebView 是以「相容模式」運作,以便在目標 API 級別 18 以下版本的應用程式中提供部分舊版功能,但您的應用程式仍有可能依附於舊版 WebView 的不明行為。

因此,如果現有應用程式使用 WebView,請務必盡快在 Android 4.4 上進行測試,並參閱「遷移至 Android 4.4 中的 WebView」,瞭解將 targetSdkVersion 更新為「19」以上的版本時,應用程式可能會受到哪些影響。

如果您的應用程式使用 AlarmManager...

將應用程式的 targetSdkVersion 設為「19」以上時,使用 set()setRepeating() 建立的鬧鐘會不精確。

為提高省電效率,Android 現在會針對在合理相似時間的所有應用程式中,將鬧鐘批次處理在一起,因此系統會喚醒裝置一次,而不是多次處理每個鬧鐘。

如果你的鬧鐘並未設定與精確的時鐘時間相關聯,但你仍須在特定時間範圍內 (例如下午 2 點到 4 點之間) 叫用鬧鐘,則可以使用新的 setWindow() 方法,接受鬧鐘的「最早」時間,以及系統叫用鬧鐘最早的「時間範圍」。

如果鬧鐘必須固定至確切的時間 (例如日曆活動提醒),您可以使用新的 setExact() 方法。

這個不精確的批次處理行為僅適用於已更新的應用程式。如果您將 targetSdkVersion 設為「18」以下,那麼在 Android 4.4 上執行鬧鐘時,鬧鐘將繼續照常運作,先前的版本會維持不變。

如果您的應用程式使用 ContentResolver 同步處理資料...

將應用程式的 targetSdkVersion 設為「19」以上時,使用 addPeriodicSync() 建立同步處理作業會在指定時間範圍的預設彈性間隔 (約 4%) 內執行同步處理作業。舉例來說,如果輪詢頻率為 24 小時,同步處理作業可能會在每天約一小時的時間內執行,而不是每天都安排好的時間。

如要自行指定同步處理作業的彈性間隔,請開始使用新的 requestSync() 方法。詳情請參閱下方「同步處理轉換器」一節。

此彈性間隔行為僅適用於已更新的應用程式。如果您將 targetSdkVersion 設為「18」以下,則現有的同步要求在 Android 4.4 上執行時,會維持先前的版本的運作方式。

列印架構

Android 現已加入完整架構,可讓使用者透過 Wi-Fi、藍牙或其他服務連線的印表機來列印任何文件。系統會處理要列印文件的應用程式與為印表機傳送列印工作的服務之間的交易。android.print 架構提供指定列印文件所需的所有 API,並傳送至系統進行列印。特定列印工作所需要的 API 取決於您的內容。

列印一般內容

如要將 UI 中的內容列印為文件,必須先建立 PrintDocumentAdapter 的子類別。您必須在這個類別中實作幾個回呼方法,包括 onLayout() 以根據提供的列印屬性建立版面配置,而 onWrite() 則可將可列印內容序列化為 ParcelFileDescriptor

您必須傳送 PDF 檔案,才能將內容寫入 ParcelFileDescriptor。新的 PdfDocument API 提供了簡便的方式,讓您從 getCanvas() 取得 Canvas,在其中繪製可列印的內容。然後使用 writeTo() 方法將 PdfDocument 寫入 ParcelFileDescriptor

定義 PrintDocumentAdapter 的實作後,您可以使用 PrintManager 方法 print() (採用 PrintDocumentAdapter 做為引數),在使用者的要求上執行列印工作。

列印圖片

如果您只想列印相片或其他點陣圖,則支援資料庫中的輔助 API 會為您處理所有工作。您只需建立新的 PrintHelper 執行個體,使用 setScaleMode() 設定縮放模式,然後將 Bitmap 傳遞至 printBitmap() 即可。就是這麼簡單!程式庫會處理與系統之間的所有其餘互動,以將點陣圖提供給印表機。

建築印刷服務

印表機原始設備製造商 (OEM) 可以使用 android.printservice 架構,為 Android 裝置的印表機提供互通性。您可以用 APK 的形式建構列印服務,供使用者安裝在裝置上。列印服務應用程式主要以無頭服務的形式運作,方法是將 PrintService 類別設為子類別,以便接收來自系統的列印工作,並使用適當通訊協定將工作傳送給印表機。

如要進一步瞭解如何列印應用程式內容,請參閱「列印內容」。

簡訊供應商

Telephony 內容供應器 (以下簡稱「簡訊供應商」) 可讓應用程式在裝置上讀取及寫入簡訊和多媒體訊息。其中包含已收到、草稿、已傳送、待處理等表格的表格。

從 Android 4.4 開始,系統設定可讓使用者選取「預設簡訊應用程式」。選取後,只有預設的訊息應用程式才能寫入簡訊服務供應商,而且只有在使用者收到簡訊或 WAP_PUSH_DELIVER_ACTION 廣播訊息時,才會收到預設的訊息應用程式接收 SMS_DELIVER_ACTION 廣播。預設訊息應用程式收到或傳送新訊息時,必須負責將詳細資料寫入簡訊供應商。

未選取做為預設訊息應用程式的其他應用程式只能讀取簡訊提供者,但也可能會在監聽 SMS_RECEIVED_ACTION 廣播時收到新的簡訊通知。這類廣播訊息無法取消,可能會傳送到多個應用程式。這則廣播適用於未選取做為預設簡訊應用程式的應用程式,但必須讀取特殊傳入的訊息,例如執行電話號碼驗證。

詳情請參閱「讓簡訊應用程式適用於 KitKat」這篇網誌文章。

無線與連線

主機卡片模擬

Android 應用程式現在可以模擬 ISO14443-4 (ISO-DEP) NFC 卡片,使用 APDU 進行資料交換 (如 ISO7816-4 所指定)。如此一來,搭載 Android 4.4 且支援 NFC 的裝置就能同時模擬多張 NFC 卡,並讓 NFC 付款感應器或其他 NFC 讀卡機能夠根據應用程式 ID (AID) 使用合適的 NFC 卡片進行交易。

如要模擬在應用程式中使用這些通訊協定的 NFC 卡片,請根據 HostApduService 類別建立服務元件。如果您的應用程式改用安全元素進行卡片模擬,您就必須根據 OffHostApduService 類別建立服務,該類別不會直接涉及交易,但您必須註冊應由安全元素處理的 AID。

詳情請參閱 NFC 卡模擬指南。

NFC 讀卡機模式

透過全新的 NFC 讀卡機模式,活動可限制所有 NFC 活動,只在前景讀取活動感興趣的標記類型。您可以利用 enableReaderMode() 為活動啟用閱讀器模式,提供 NfcAdapter.ReaderCallback 的實作方式,在偵測到新標記時接收回呼。

這項新功能結合主機卡片模擬功能,可讓 Android 在行動付款介面的兩端運作:一部裝置可做為付款終端機 (一種執行閱讀器模式活動的裝置) 運作,另一部裝置則做為付款用戶端 (模擬 NFC 卡片的裝置)。

紅外線傳送器

現在在含有紅外線 (IR) 傳送器的裝置上執行時,現在可以使用 ConsumerIrManager API 傳輸 IR 信號。如要取得 ConsumerIrManager 的例項,請使用 CONSUMER_IR_SERVICE 做為引數呼叫 getSystemService()。然後,您可以使用 getCarrierFrequencies() 查詢裝置支援的 IR 頻率,並透過 transmit() 傳遞所需頻率和訊號模式,藉此傳輸信號。

請務必先呼叫 hasIrEmitter(),檢查裝置是否包含 IR 傳輸器;但如果應用程式只與有這類傳輸器的裝置相容,則應在 "android.hardware.consumerir" (FEATURE_CONSUMER_IR) 的資訊清單中加入 <uses-feature> 元素。

多媒體

自動調整播放

MediaCodec API 現已支援自動調整影片播放功能,讓播放至 Surface 時能順暢地變更解析度。您可以提供新解析度的解碼器輸入影格,以及輸出緩衝區的解析度變更,而不會有大幅落差。

您可以為 MediaFormat 新增兩個鍵,藉此啟用自動調整播放功能,透過轉碼器 KEY_MAX_WIDTHKEY_MAX_HEIGHT 指定應用程式所需的最高解析度。將這些項目新增至 MediaFormat 後,請使用 configure()MediaFormat 傳遞至 MediaCodec 例項。

轉碼器會在與這些值相同或小於這些值的解析度之間自動轉換。轉碼器也支援大於指定上限的解析度 (只要未達支援設定檔的上限),但無法順利轉換至較大的解析度。

如要在解碼 H.264 影片時變更解析度,請繼續使用 MediaCodec.queueInputBuffer() 將影格排入佇列,但務必在單一緩衝區中提供新的序列參數集 (SPS) 和圖片參數集 (PPS) 值與即時解碼器重新整理 (IDR) 影格。

不過,在嘗試設定自動調整播放功能的轉碼器之前,您必須先使用 FEATURE_AdaptivePlayback 呼叫 isFeatureSupported(String),確認裝置是否支援自動調整播放功能。

注意:自動調整播放功能僅適用於特定供應商,部分轉碼器可能需要較多記憶體,才能提供較大的解析度提示。因此,建議您根據要解碼的來源素材設定最大解析度。

隨選音訊時間戳記

為協助同步處理音訊影片,新的 AudioTimestamp 類別會在 AudioTrack 處理的音訊串流中提供特定「影格」的時間軸詳細資料。如要取得最新的可用時間戳記,請將 AudioTimestamp 物件例項化,並傳遞至 getTimestamp()。如果時間戳記要求成功,AudioTrack 例項會填入影格單元中的位置,以及該影格出現或承諾顯示的預估時間。

您可以在與 framePosition 相比的情況下,使用 AudioTimestamp 中的 nanoTime 值 (其單調性) 找出最接近的相關視訊影格,以便根據音訊捨棄、重複或插入影格。另外,您也可以判斷 nanoTime 值與未來影片影格預期時間之間的差距 (同時考量取樣率),藉此預測在相同時間點播放的音訊影格與影片影格。

途徑圖片讀取器

新的 ImageReader API 可讓您在圖片緩衝區算繪至 Surface 時直接存取。您可以使用靜態方法 newInstance() 取得 ImageReader。接著,呼叫 getSurface() 建立新的 Surface,並向 MediaPlayerMediaCodec 等生產端傳送圖片資料。如要在途徑提供新圖片時收到通知,請實作 ImageReader.OnImageAvailableListener 介面,並用 setOnImageAvailableListener() 註冊。

現在當您繪製內容到 Surface 時,每當有新的圖片影格時,ImageReader.OnImageAvailableListener 都會收到對 onImageAvailable() 的呼叫,並提供對應的 ImageReader。您可以呼叫 acquireLatestImage()acquireNextImage(),使用 ImageReader 取得影格的圖片資料做為 Image 物件。

Image 物件可讓您直接存取 ByteBuffer 中的圖片時間戳記、格式、尺寸和像素資料。不過,為了讓 Image 類別解讀圖片,圖片格式必須符合 ImageFormatPixelFormat 中常數定義的類型之一。

峰值與 RMS 測量

您現在可以透過建立 Visualizer.MeasurementPeakRms 的新執行個體並傳遞至 getMeasurementPeakRms(),從 Visualizer 查詢目前音訊串流的峰值和 RMS。您呼叫此方法時,指定 Visualizer.MeasurementPeakRms 的峰值和 RMS 值會設為最新的測量值。

音量強化工具

LoudnessEnhancerAudioEffect 的新子類別,可讓您提高 MediaPlayerAudioTrack 的可聽音量。這特別適合搭配上述新的 getMeasurementPeakRms() 方法使用,以便在其他媒體播放時提高語音音軌的音量。

遙控器

Android 4.0 (API 級別 14) 推出了 RemoteControlClient API,可讓媒體應用程式使用遠端用戶端的媒體控制器事件,例如螢幕鎖定畫面上的媒體控制項。現在,新的 RemoteController API 可讓您建構自己的遙控器,開發創新的應用程式和周邊裝置,用於控制任何與 RemoteControlClient 整合的媒體應用程式播放作業。

如要建構遠端控制器,您可以用任何方式實作使用者介面,但如要將媒體按鈕事件傳送至使用者的媒體應用程式,您必須建立擴充 NotificationListenerService 類別的服務,並實作 RemoteController.OnClientUpdateListener 介面。以 NotificationListenerService 做為基礎至關重要,因為它能提供適當的隱私權限制,要求使用者在應用程式安全性設定內啟用應用程式做為通知事件監聽器。

NotificationListenerService 類別包含幾個必須實作的抽象方法,但如果您只想使用媒體控制器事件來處理媒體播放,可以將這些實作保留空白,改為聚焦於 RemoteController.OnClientUpdateListener 方法。

遠端控制器的評分

Android 4.4 是以遠端控制用戶端 (透過 RemoteControlClient 接收媒體控制事件的應用程式) 現有的功能為基礎,導入新功能,方便使用者透過遙控器為目前的曲目評分。

新的 Rating 類別會封裝使用者評分相關資訊。評分是以評分樣式 (RATING_HEARTRATING_THUMB_UP_DOWNRATING_3_STARSRATING_4_STARSRATING_5_STARSRATING_PERCENTAGE) 及適用於該樣式的評分值所定義。

如何允許使用者透過遙控器為您的曲目評分:

如要在使用者從遠端控制器變更評分時接收回呼,請實作新的 RemoteControlClient.OnMetadataUpdateListener 介面,並將例項傳遞至 setMetadataUpdateListener()。當使用者變更評分時,RemoteControlClient.OnMetadataUpdateListener 會收到對 onMetadataUpdate() 的呼叫,並傳遞 RATING_KEY_BY_USER 做為鍵,並將 Rating 物件做為值傳遞。

隱藏式輔助字幕

播放 HTTP 即時串流 (HLS) 影片時,VideoView 現在支援 WebVTT 字幕軌,根據使用者在系統設定中定義的隱藏式輔助字幕偏好設定顯示字幕軌。

您也可以使用 addSubtitleSource() 方法,向 VideoView 提供 WebVTT 字幕軌。這個方法接受可輸出字幕資料格式的 InputStream,以及指定字幕資料格式的 MediaFormat 物件,您可使用 createSubtitleFormat() 加以指定。系統會根據使用者的偏好設定,顯示這些字幕。

如果您沒有使用 VideoView 顯示影片內容,請盡可能配合使用者的隱藏式輔助字幕偏好設定,讓字幕重疊廣告盡可能符合使用者的需求。新的 CaptioningManager API 可讓您查詢使用者的隱藏式輔助字幕偏好設定,包括由 CaptioningManager.CaptionStyle 定義的樣式,例如字體和顏色。如要在影片開始後調整使用者的某些偏好設定,您應該註冊 CaptioningManager.CaptioningChangeListener 的例項來監聽偏好設定的變更,以便在任何偏好設定變更時收到回呼,並視需要更新字幕。

動畫與圖形

場景和轉場效果

新的 android.transition 架構提供 API,可在使用者介面的不同狀態之間建立動畫。主要功能可讓您定義 UI 的不同狀態,也就是為每個 UI 建立個別的版面配置。當您想要從一個場景開始建立動畫時,請執行「轉場」,用於計算將目前場景從目前場景變更到下一個場景所需的動畫。

如要在兩個場景之間切換,通常必須執行下列作業:

  1. 指定 ViewGroup,其中包含您要變更的 UI 元件。
  2. 指定代表變更最終結果 (下一個場景) 的版面配置。
  3. 指定要以動畫呈現版面配置變更的轉場類型。
  4. 執行轉場效果。

您可以使用 Scene 物件完成步驟 1 和 2。Scene 包含中繼資料,用於描述執行轉場效果所需的版面配置屬性,包括場景的上層檢視畫面和場景的版面配置。您可以使用類別建構函式或靜態方法 getSceneForLayout() 建立 Scene

然後,必須使用 TransitionManager 完成步驟 3 和 4。其中一種方法是將 Scene 傳遞至靜態方法 go()。這會在目前的版面配置中找出場景的上層檢視畫面,並在子檢視畫面上進行轉換,以便觸及 Scene 所定義的版面配置。

或者,您完全不需要建立 Scene 物件,但可以呼叫 beginDelayedTransition(),指定包含要變更檢視畫面的 ViewGroup。然後新增、移除或重新設定目標檢視畫面。系統視需求安排變更之後,系統會開始轉場為所有受影響的檢視畫面加入動畫效果。

如要進一步控管,您可以使用專案 res/transition/ 目錄中的 XML 檔案,定義應在預先定義場景之間發生的轉換組合。在 <transitionManager> 元素中,指定一或多個 <transition> 標記,這些標記都用於指定場景 (版面配置檔案的參照),以及進入和/或離開該場景時要套用的轉換。然後使用 inflateTransitionManager() 加載這組轉場效果。使用傳回的 TransitionManagertransitionTo() 執行每個轉場,並傳遞由其中一個 <transition> 標記代表的 Scene。您也可以使用 TransitionManager API,以程式輔助方式定義轉場效果組合。

指定轉場效果時,您可以使用 Transition 子類別定義的多種預先定義類型,例如 FadeChangeBounds。如未指定轉場類型,系統會使用 AutoTransition,視需要自動淡出、移動和調整檢視畫面大小。此外,您可以擴充任何類別,以您偏好的方式執行動畫,藉此建立自訂轉場效果。自訂轉場效果可以追蹤您想要的任何屬性變更,並根據這些變更建立任何所需的動畫。舉例來說,您可以提供 Transition 的子類別,監聽檢視區塊「旋轉」屬性的變更,然後為任何變更加上動畫效果。

詳情請參閱 TransitionManager 說明文件。

暫停動畫

Animator API 現在可讓您使用 pause()resume() 方法暫停及繼續播放中的動畫。

如要追蹤動畫的狀態,您可以實作 Animator.AnimatorPauseListener 介面,此介面會在動畫暫停和繼續播放時提供回呼:pause()resume()。然後使用 addPauseListener() 將事件監聽器新增至 Animator 物件。

另外,您也可以將 AnimatorListenerAdapter 抽象類別設為子類別,該類別現在包含由 Animator.AnimatorPauseListener 定義的暫停和恢復回呼空白實作。

可重複使用的點陣圖

現在,您可以在 BitmapFactory 中重複使用任何可變動的點陣圖,解碼任何其他點陣圖 (即使新點陣圖不同大小時),只要解碼點陣圖產生的位元組數量 (可從 getByteCount() 取得) 小於或等於重複使用的點陣圖數量 (可從 getAllocationByteCount() 取得) 即可。詳情請參閱 inBitmap

新的 Bitmap API 允許在 BitmapFactory 外重複使用類似的重新設定 (用於手動產生點陣圖或自訂解碼邏輯)。您現在可以使用 setHeight()setWidth() 方法設定點陣圖的尺寸,並使用 setConfig() 指定新的 Bitmap.Config,而不影響基礎點陣圖配置。reconfigure() 方法還可讓您輕鬆地將這些變更內容與單一呼叫合併。

不過,請勿重新設定檢視系統目前使用的點陣圖,因為基礎像素緩衝區不會以可預測的方式重新對應。

使用者內容

儲存空間存取架構

在舊版 Android 中,如果您想讓應用程式從其他應用程式擷取特定類型的檔案,則必須使用 ACTION_GET_CONTENT 動作叫用意圖。這個動作仍是要求匯入應用程式的適當方法。不過,Android 4.4 推出了 ACTION_OPEN_DOCUMENT 動作,可讓使用者選取特定類型的檔案,並授予應用程式的長期讀取權限 (可能具備寫入權限),而不必將檔案匯入應用程式。

如果您開發的應用程式可為檔案 (例如雲端儲存服務) 提供儲存服務,可以實作內容供應器做為新 DocumentsProvider 類別的子類別,藉此加入這個整合式 UI,以便選擇檔案。DocumentsProvider 的子類別必須包含接受 PROVIDER_INTERFACE 動作 ("android.content.action.DOCUMENTS_PROVIDER") 的意圖篩選器。接著,您必須在 DocumentsProvider 中實作四個抽象方法:

queryRoots()
系統必須傳回 Cursor,說明文件儲存空間的所有根目錄 (使用 DocumentsContract.Root 中定義的資料欄)。
queryChildDocuments()
這個方法必須傳回 Cursor,其中描述指定目錄中的所有檔案 (使用 DocumentsContract.Document 中定義的資料欄)。
queryDocument()
這個方法必須傳回說明指定檔案的 Cursor,並使用 DocumentsContract.Document 中定義的資料欄。
openDocument()
這個方法必須傳回代表指定檔案的 ParcelFileDescriptor。使用者選取檔案後,如果用戶端應用程式透過呼叫 openFileDescriptor() 要求存取該檔案,系統會呼叫此方法。

詳情請參閱儲存空間存取架構指南。

外部儲存空間存取權

您現在可以在次要外部儲存媒體中讀取及寫入應用程式特定檔案,例如裝置同時提供模擬儲存空間和 SD 卡時。新方法 getExternalFilesDirs() 的運作方式與現有的 getExternalFilesDir() 方法相同,只不過它會傳回 File 物件的陣列。在讀取或寫入此方法傳回的任何路徑之前,請將 File 物件傳遞至新的 getStorageState() 方法,驗證目前儲存空間是否可用。

存取應用程式專屬快取目錄和 OBB 目錄的其他方法現在也有對應版本,可提供次要儲存裝置的存取權:getExternalCacheDirs()getObbDirs()

傳回 File 陣列中的第一個項目會視為裝置的主要外部儲存空間,與現有方法 (例如 getExternalFilesDir()) 傳回的 File 相同。

注意:自 Android 4.4 起,如果只需要以上述方法存取應用程式的外部儲存空間特定區域,則該平台不再需要取得 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE。不過,如果您想存取外部儲存空間的可共用區域 (由 getExternalStoragePublicDirectory() 提供),就必須取得這些權限。

同步轉換介面

ContentResolver 中的新 requestSync() 方法會封裝在新的 SyncRequest 物件 (可使用 SyncRequest.Builder 建立) 中,簡化了定義 ContentProvider 同步要求的部分程序。SyncRequest 中的屬性提供與現有 ContentProvider 同步呼叫相同的功能,但可讓您啟用 setDisallowMetered(),指定在網路採用計量付費的情況下,應捨棄同步處理作業。

使用者輸入

新的感應器類型

新的 TYPE_GEOMAGNETIC_ROTATION_VECTOR 感應器會根據磁力儀提供旋轉向量資料,在無法使用陀螺儀時,或搭配批次感應器事件使用時,可取代 TYPE_ROTATION_VECTOR 感應器,在手機休眠時記錄裝置的螢幕方向。這個感應器所需的耗電量低於 TYPE_ROTATION_VECTOR,但事件資料可能較容易受到吵雜事件資料,且在使用者外出時能發揮最佳效用。

Android 現在也支援硬體內建的步數感應器:

TYPE_STEP_DETECTOR
這個感應器會在使用者完成步數時觸發事件。在每個使用者步驟中,這個感應器都會傳送值為 1.0 的事件,以及指出步驟發生時間的時間戳記。
TYPE_STEP_COUNTER
此感應器也會在每次偵測到步驟時觸發事件,但會改為傳送自應用程式首次註冊此感應器以來累積的總步數。

請注意,這兩個步驟感應器所提供的結果不一定會相同。TYPE_STEP_COUNTER 事件發生的時間比 TYPE_STEP_DETECTOR 事件長,但這是因為 TYPE_STEP_COUNTER 演算法會執行更多作業來排除偽陽性的情形。因此 TYPE_STEP_COUNTER 傳送事件的速度可能較慢,但結果應更加準確。

這兩個步驟感應器皆取決於硬體 (Nexus 5 是第一款支援這類裝置的裝置),因此建議你使用 FEATURE_SENSOR_STEP_DETECTORFEATURE_SENSOR_STEP_COUNTER 常數,透過 hasSystemFeature() 檢查是否有可用性。

批次感應器事件

為了更妥善地管理裝置電源,SensorManager API 現在可讓您指定系統向應用程式傳送感應器事件批次的頻率。這不會減少應用程式在一段時間內的實際感應器事件數量,而是透過感應器更新降低系統呼叫 SensorEventListener 的頻率。也就是說,系統不會在發生事件時把每個事件傳送到應用程式,而是儲存一段時間內發生的所有事件,然後一次傳送到應用程式。

如要提供批次,SensorManager 類別會新增兩個新版 registerListener() 方法,讓您指定「報表最長延遲時間」。這個新參數可指定 SensorEventListener 容許在傳送新感應器事件時,容許的最長延遲時間。舉例來說,如果指定的批次延遲時間為一分鐘,系統會對 onSensorChanged() 方法連續呼叫 onSensorChanged() 方法的每個事件,以不超過一分鐘的間隔傳送近期整組事件。感應器事件的延遲時間絕不會超過報表延遲時間上限,但如果同一感應器要求較短的延遲時間,感應器事件可能會更快送達。

不過請注意,感應器「只有在 CPU 處於喚醒狀態時」才會根據回報的延遲時間,為應用程式傳送批次事件。雖然支援批次處理功能的硬體感應器會在 CPU 處於休眠狀態時繼續收集感應器事件,但不會喚醒 CPU 為應用程式傳送批次事件。當感應器最終用盡事件的記憶體時,就會開始捨棄最舊的事件,以便儲存最新的事件。您可以在感應器填滿記憶體前喚醒裝置,然後呼叫 flush() 擷取最新的一批事件,可避免遺失事件。如要估算記憶體會用盡的時間,請呼叫 getFifoMaxEventCount(),取得可儲存的感應器事件數量上限,然後將這個數字除以應用程式所需的每個事件的速率。請使用這個計算方法設定喚醒鬧鐘,其中 AlarmManager 會叫用 Service (實作 SensorEventListener) 來清除感應器。

注意:並非所有裝置都支援批次處理感應器事件,因為這項功能需要硬體感應器支援。不過,從 Android 4.4 開始,您應一律使用新的 registerListener() 方法,因為如果裝置不支援批次處理,系統會妥善忽略批次延遲引數,並即時傳送感應器事件。

控制器身分

Android 現在會使用專屬整數來識別每個已連線的控制器,您可以使用 getControllerNumber() 查詢這個整數,更輕鬆地將每個控制器與遊戲中的不同玩家建立關聯。每個控制器的號碼可能會因使用者中斷連線、連線或重新設定而改變,因此請註冊 InputManager.InputDeviceListener 的執行個體,以追蹤與每個輸入裝置對應的控制器號碼。然後在發生變更時為每個 InputDevice 呼叫 getControllerNumber()

已連結的裝置現在也會提供 getProductId()getVendorId() 提供的產品和供應商 ID。如果需要根據裝置可用的一組按鍵修改按鍵對應設定,可以查詢裝置,檢查 hasKeys(int...) 中是否有特定按鍵可用。

使用者介面

沉浸式全螢幕模式

為了為應用程式提供填滿整個螢幕的版面配置,新的 setSystemUiVisibility() SYSTEM_UI_FLAG_IMMERSIVE 旗標 (與 SYSTEM_UI_FLAG_HIDE_NAVIGATION 合併使用) 會啟用新的沉浸全螢幕模式。啟用沉浸模式後,您的活動會繼續收到所有觸控事件。使用者可以沿著系統列一般顯示的區域向內滑動,即可看到系統列。此操作會清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 旗標 (以及 SYSTEM_UI_FLAG_FULLSCREEN 旗標,如果已套用),以便持續顯示系統資訊列。不過,如果您希望系統資訊在稍後再次隱藏,可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 標記。

半透明系統列

您現在可以使用 Theme.Holo.NoActionBar.TranslucentDecorTheme.Holo.Light.NoActionBar.TranslucentDecor 新主題,讓系統資訊列部分透明。啟用半透明系統列後,版面配置就會填滿系統列後方的區域,因此您必須為版面配置中不應出現在系統列的部分啟用 fitsSystemWindows

如要建立自訂主題,請將其中一個主題設為父項主題,或是在主題中加入 windowTranslucentNavigationwindowTranslucentStatus 樣式屬性。

加強型通知事件監聽器

Android 4.3 新增了 NotificationListenerService API,可讓應用程式在系統發布的新通知時接收相關資訊。在 Android 4.4 中,通知事件監聽器可擷取通知的其他中繼資料,以及通知動作的完整詳細資料:

新的 Notification.extras 欄位包含 Bundle,用於傳送通知建構工具的額外中繼資料,例如 EXTRA_TITLEEXTRA_PICTURE。新的 Notification.Action 類別定義了附加至通知的動作特性,您可以從新的 actions 欄位擷取相關資訊。

RTL 版面配置的可繪項目鏡像

在舊版 Android 中,如果應用程式所含圖片應對由右至左的版面配置反轉水平方向,就必須在 drawables-ldrtl/ 資源目錄中加入鏡像的圖片。現在,系統可以在可繪製資源中啟用 autoMirrored 屬性或呼叫 setAutoMirrored(),自動為你建立圖像鏡像。啟用後,當版面配置方向為從右到左時,Drawable 會自動雙向同步。

無障礙功能

View 類別現在可讓您在 XML 版面配置中新增 accessibilityLiveRegion 屬性或呼叫 setAccessibilityLiveRegion(),為以動態方式更新的部分使用者介面部分宣告「即時區域」。舉例來說,如果登入畫面的文字欄位顯示「密碼錯誤」通知,就應該標示為有效區域,讓螢幕閱讀器會在訊息變更時重新引用訊息。

提供無障礙服務的應用程式現在也能透過新的 API 強化其功能,這些 API 可透過 AccessibilityNodeInfo.CollectionInfoAccessibilityNodeInfo.CollectionItemInfo 提供檢視區塊集合 (例如清單或格狀檢視) 的相關資訊。

應用程式權限

應用程式必須透過 <uses-permission> 標記要求下列新權限,才能使用某些新的 API:

INSTALL_SHORTCUT
允許應用程式在啟動器中安裝捷徑
UNINSTALL_SHORTCUT
允許應用程式解除安裝啟動器中的捷徑
TRANSMIT_IR
允許應用程式使用裝置的 IR 傳輸器 (如果有的話)

注意:自 Android 4.4 起,如要使用 getExternalFilesDir() 等方法存取位於外部儲存空間的應用程式特定區域,自 Android 4.4 版本起,應用程式不再需要取得 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE。不過,如果您想存取外部儲存空間的可共用區域 (由 getExternalStoragePublicDirectory() 提供),仍需要您授予權限。

裝置功能

您可以使用 <uses-feature> 標記宣告下列新的裝置功能,藉此宣告應用程式需求、在 Google Play 啟用篩選功能,或在執行階段進行檢查:

FEATURE_CONSUMER_IR
本裝置能夠與消費者紅外線裝置通訊。
FEATURE_DEVICE_ADMIN
該裝置支援透過裝置管理員強制執行裝置政策。
FEATURE_NFC_HOST_CARD_EMULATION
裝置支援主機式 NFC 卡模擬功能。
FEATURE_SENSOR_STEP_COUNTER
裝置包含硬體步數計數器。
FEATURE_SENSOR_STEP_DETECTOR
裝置包含硬體步數偵測工具。

如需 Android 4.4 所有 API 變更的詳細資訊,請參閱 API 差異報告