Android 4.1 API

API 級別:16

Android 4.1 (JELLY_BEAN) 是平台的進階版本,可提供更佳的效能和使用者體驗。為使用者和應用程式開發人員提供新功能。本文件將為應用程式開發人員介紹最值得注意和實用的全新 API。

身為應用程式開發人員,您可以透過 SDK Manager 取得 Android 4.1,做為可在 Android 模擬器中執行的系統映像檔,以及可用來建構應用程式的 SDK 平台。您應盡快下載系統映像檔和平台,以便在 Android 4.1 上建構及測試應用程式。

如要針對搭載 Android 4.1 的裝置更妥善地將應用程式最佳化,您應將 targetSdkVersion 設為 "16",在 Android 4.1 系統映像檔上安裝、進行測試,然後使用這項變更發布更新。

您可以在 Android 4.1 中使用 API,同時支援舊版,方法是在程式碼中新增條件,在執行 minSdkVersion 不支援的 API 前檢查系統 API 級別。如要進一步瞭解如何維持回溯相容性,請參閱「建立與先前版本相容的 UI」。

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

應用程式元件

隔離服務

透過在 <service> 標記中指定 android:isolatedProcess="true"Service 會在其專屬的獨立使用者 ID 程序下執行,而該程序不具備自己的權限。

記憶體管理

新的 ComponentCallbacks2 常數 (例如 TRIM_MEMORY_RUNNING_LOWTRIM_MEMORY_RUNNING_CRITICAL) 可在系統呼叫 onLowMemory() 前,提供更多記憶體狀態相關資訊。

新的 getMyMemoryState(ActivityManager.RunningAppProcessInfo) 方法可讓您擷取一般記憶體狀態。

內容供應器

新方法 acquireUnstableContentProviderClient() 可讓您存取可能「不穩定」的 ContentProviderClient,進而在內容供應器的情況下,應用程式不會當機。在您與其他應用程式中的內容供應者互動時,這項功能就很實用。

動態桌布

新增意圖通訊協定,可直接啟動動態桌布預覽活動,協助使用者輕鬆選取動態桌布,而不必強制離開應用程式並瀏覽首頁桌布挑選器。

如要啟動動態桌布挑選器,請使用 ACTION_CHANGE_LIVE_WALLPAPER 搭配 Intent 呼叫 startActivity(),並在 EXTRA_LIVE_WALLPAPER_COMPONENT 中將動態桌布 ComponentName 指定為字串。

應用程式堆疊導覽

在 Android 4.1 中,您可以更輕鬆地實作適當的向上導覽設計模式。您只需要在資訊清單檔案中的每個 <activity> 元素中新增 android:parentActivityName,當使用者按下動作列中的向上按鈕 (同時完成目前的活動) 時,系統會根據這項資訊開啟適當的活動。因此,如果您為每個活動宣告 android:parentActivityName,就不需要使用 onOptionsItemSelected() 方法處理動作列應用程式圖示上的點擊事件,因為系統現在會處理該事件,並暫停或建立適當的活動。

在使用者透過「深入瞭解」意圖 (例如來自通知或其他應用程式意圖) 進入應用程式活動的情況下,這項功能特別實用 (如「在應用程式之間瀏覽」設計指南所述)。當使用者以這種方式進入活動時,應用程式可能不會自然地建立可在使用者向上瀏覽時繼續執行的活動回溯堆疊。不過,當您為活動提供 android:parentActivityName 屬性時,系統會判斷應用程式是否已包含父項活動的返回堆疊,如果沒有,則會建構包含所有父項活動的合成返回堆疊。

注意:當使用者在應用程式中輸入深層活動,並為應用程式建立新工作時,系統實際上會將父項活動的堆疊插入工作中。因此,按下返回按鈕也會透過父項活動堆疊返回。

當系統為應用程式建立合成返回堆疊時,會建立基本 Intent,以便為每個父項活動建立新例項。因此,對於父項活動,系統不會儲存使用者進行各項活動時的自然瀏覽方式。如果任何父項活動通常會顯示依賴使用者內容的 UI,則該內容資訊將遺失,您應在使用者透過堆疊返回時提供該資訊。舉例來說,如果使用者在音樂應用程式中查看專輯,向上導覽可能會將他們帶往列出所選音樂類型中所有專輯的活動。在這種情況下,如果必須建立堆疊,您必須告知父項活動目前專輯所屬的類型,以便父項顯示適當的清單,就像使用者實際來自該活動一樣。如要將這類資訊傳送至合成父項活動,您必須覆寫 onPrepareNavigateUpTaskStack() 方法。這會提供系統為合成父項活動而建立的 TaskStackBuilder 物件。TaskStackBuilder 包含系統用來建立每個父項活動的 Intent 物件。在 onPrepareNavigateUpTaskStack() 的實作中,您可以修改適當的 Intent,新增額外資料,讓父項活動可用於判斷適當的內容,並顯示適當的 UI。

系統建立 TaskStackBuilder 時,會新增 Intent 物件,用來按照邏輯順序,從活動樹狀結構頂端建立父項活動。因此,最後一個新增至內部陣列的 Intent 就是目前活動的直接父項。如果您想修改活動父項的 Intent,請先使用 getIntentCount() 判斷陣列的長度,然後將該值傳遞至 editIntentAt()

如果您的應用程式結構較複雜,可以使用其他 API 處理向上導覽的行為,並完整自訂合成返回堆疊。提供額外控制選項的部分 API 包括:

onNavigateUp()
覆寫這個方法,在使用者按下向上按鈕時執行自訂動作。
navigateUpTo(Intent)
呼叫這個方法,即可完成目前的活動,並前往由提供的 Intent 指示的活動。如果活動存在於返回堆疊中,但並非最接近的父項,則目前活動和使用該意圖指定活動之間的所有其他活動也會完成。
getParentActivityIntent()
呼叫這個方法,即可取得 Intent,該方法會啟動目前活動的邏輯上層。
shouldUpRecreateTask(Intent)
呼叫此方法,即可查詢是否必須建立合成返回堆疊,才能向上導覽。如果必須建立合成堆疊,則傳回 true;如果適當的堆疊已存在,則傳回 false。
finishAffinity()
呼叫此方法,即可完成目前活動和所有父項活動,這些活動都具有與目前活動相同的任務相依性,且會鏈結至目前活動。如果您覆寫 onNavigateUp() 等預設行為,則應在向上導覽時建立合成回溯堆疊時呼叫此方法。
onCreateNavigateUpTaskStack
如需完整控管綜合工作堆疊的建立方式,請覆寫這項設定。如果您只想將一些額外資料新增至返回堆疊的意圖,請改為覆寫 onPrepareNavigateUpTaskStack()

不過,大多數應用程式不需要使用這些 API 或實作 onPrepareNavigateUpTaskStack(),但只要在每個 <activity> 元素中新增 android:parentActivityName,就能實現正確的行為。

多媒體

媒體轉碼器

MediaCodec 類別提供低階媒體轉碼器的存取權,用於編碼及解碼媒體。您可以呼叫 createEncoderByType() 來編碼媒體,或呼叫 createDecoderByType() 來解碼媒體,藉此例項化 MediaCodec。每個方法都會針對您要編碼或解碼的媒體類型採用 MIME 類型,例如 "video/3gpp""audio/vorbis"

建立 MediaCodec 的例項後,您可以呼叫 configure() 來指定屬性,例如媒體格式或內容是否已加密。

無論您是要編碼或解碼媒體,建立 MediaCodec 後的後續程序都相同。首先呼叫 getInputBuffers() 取得輸入 ByteBuffer 物件的陣列,然後呼叫 getOutputBuffers() 取得輸出 ByteBuffer 物件的陣列。

準備好進行編碼或解碼時,請呼叫 dequeueInputBuffer() 來取得 ByteBuffer 的索引位置 (來自輸入緩衝區的陣列),您應使用該位置來提供來源媒體。將來源媒體填入 ByteBuffer 後,請呼叫 queueInputBuffer() 釋出緩衝區的擁有權。

同樣地,如果是輸出緩衝區,請呼叫 dequeueOutputBuffer() 來取得接收結果的 ByteBuffer 索引位置。讀取 ByteBuffer 的輸出內容後,請呼叫 releaseOutputBuffer() 釋出擁有權。

您可以呼叫 queueSecureInputBuffer() 並搭配使用 MediaCrypto API (而非一般 queueInputBuffer()),藉此在編解碼器中處理加密的媒體資料。

如要進一步瞭解如何使用編解碼器,請參閱 MediaCodec 說明文件。

按提示錄製音訊

新方法 startRecording() 可讓您根據 MediaSyncEvent 定義的提示開始錄音。MediaSyncEvent 會指定音訊工作階段 (例如由 MediaPlayer 定義的工作階段),當工作階段完成時,會觸發錄音工具開始錄音。舉例來說,您可以使用這項功能播放音訊音調,表示錄製工作階段的開始,並自動開始錄製,這樣就不必手動同步音調和錄製開始時間。

時間軸文字軌

MediaPlayer 現在可處理頻帶內和頻帶外的文字音軌。頻內文字軌會以 MP4 或 3GPP 媒體來源中的文字軌形式提供。可透過 addTimedTextSource() 方法,將頻外文字音軌新增為外部文字來源。新增所有外部文字追蹤來源後,應呼叫 getTrackInfo(),以便取得資料來源中所有可用追蹤項目的更新清單。

如要設定與 MediaPlayer 搭配使用的音軌,必須使用所要使用音軌的索引位置呼叫 selectTrack()

如要接收文字軌播放就緒的通知,請實作 MediaPlayer.OnTimedTextListener 介面並將其傳遞至 setOnTimedTextListener()

音效

AudioEffect 類別現在支援在擷取音訊時,使用其他音訊預先處理類型:

  • 搭配 AcousticEchoCanceler 的聲學降噪 (AEC) 可從擷取的音訊信號中移除遠端方傳來的信號。
  • 搭配 AutomaticGainControl 的自動增益控制 (AGC) 會自動將擷取信號的輸出值標準化。
  • 搭配 NoiseSuppressor 的雜訊抑制器 (NS) 會從擷取的信號中移除背景雜訊。

您可以使用其中一個 AudioEffect 子類別,在使用 AudioRecord 擷取的音訊上套用這些前置處理器效果。

注意:並非所有裝置都支援這些效果,因此您應該一律先在對應的音訊效果類別上呼叫 isAvailable(),以便檢查是否可用。

不間斷播放

您現在可以在兩個 MediaPlayer 物件之間執行無間斷播放。在第一個 MediaPlayer 完成之前的任何時間,請呼叫 setNextMediaPlayer(),Android 會在第一個播放器停止時嘗試啟動第二個播放器。

媒體路由器。新的 API MediaRouter、MediaRouteActionProvider 和 MediaRouteButton 提供標準機制和 UI,可用於選擇播放媒體的位置。

相機

自動對焦移動

新版介面 Camera.AutoFocusMoveCallback 可讓您監聽自動對焦動作的變更。您可以使用 setAutoFocusMoveCallback() 註冊介面。接著,當相機處於連續自動對焦模式 (FOCUS_MODE_CONTINUOUS_VIDEOFOCUS_MODE_CONTINUOUS_PICTURE) 時,您會收到 onAutoFocusMoving() 的呼叫,指出自動對焦是否已開始或停止移動。

相機音效

MediaActionSound 類別提供一組簡單的 API,可產生相機或其他媒體動作所發出的標準聲響。您應在建構自訂靜態相機或攝影機時,使用這些 API 播放適當的音效。

如要播放音效,只要將 MediaActionSound 物件例項化,呼叫 load() 預先載入所需音訊,然後在適當的時間呼叫 play() 即可。

連線能力

Android Beam

Android Beam™ 現在支援透過藍牙傳輸大型酬載。使用新的 setBeamPushUris() 方法或新的回呼介面 NfcAdapter.CreateBeamUrisCallback 定義要轉移的資料時,Android 會處理將資料傳輸到藍牙或其他替代傳輸,以達到更快的傳輸速度。這項功能特別適合用於圖片和音訊檔案等大型酬載,而且不需要在裝置之間進行明顯配對。應用程式不必額外執行任何作業,即可利用藍牙傳輸功能。

setBeamPushUris() 方法會使用 Uri 物件的陣列,該陣列會指定您要從應用程式轉移的資料。您也可以實作 NfcAdapter.CreateBeamUrisCallback 介面,並透過呼叫 setBeamPushUrisCallback() 為活動指定此介面。

使用回呼介面時,當使用者透過 Android Beam 執行分享作業,系統會呼叫介面的 createBeamUris() 方法,讓您在分享時定義要分享的 URI。如果要分享的 URI 可能因活動中的使用者情境而異,這項方法就很實用;而如果要分享的 URI 不會變更,且您可以提前安全地定義這些 URI,則呼叫 setBeamPushUris() 會更實用。

網路服務搜尋

Android 4.1 新增對多重目的地 DNS 服務探索功能的支援,可讓您透過 Wi-Fi 尋找並連線至同級裝置提供的服務,例如行動裝置、印表機、相機、媒體播放器和其他已在本機網路上註冊的裝置。

新套件 android.net.nsd 包含新的 API,可讓您在區域網路上播送服務、探索網路上的本機裝置,以及連線至裝置。

如要註冊服務,您必須先建立 NsdServiceInfo 物件,並使用 setServiceName()setServiceType()setPort() 等方法定義服務的各種屬性。

接著,您需要實作 NsdManager.RegistrationListener,並透過 NsdServiceInfo 將其傳遞至 registerService()

如要探索網路上的服務,請實作 NsdManager.DiscoveryListener 並將其傳遞至 discoverServices()

NsdManager.DiscoveryListener 收到關於所找到服務的回呼時,您必須呼叫 resolveService() 來解析服務,並傳遞 NsdManager.ResolveListener 的實作項目,以便接收包含所找到服務相關資訊的 NsdServiceInfo 物件,讓您能夠啟動連線。

Wi-Fi P2P 服務探索

Android 4.1 中強化了 Wi-Fi P2P API,以便在 WifiP2pManager 中支援預先關聯服務探索功能。這樣一來,您就能在連線前,使用 Wi-Fi P2P 探索服務,探索及篩選附近的裝置。此外,您也可以透過網路服務探索功能,探索已連線網路 (例如區域 Wi-Fi 網路) 上的服務。

如要透過 Wi-Fi 以服務形式廣播您的應用程式,讓其他裝置可以找到您的應用程式並進行連線,請使用描述應用程式服務的 WifiP2pServiceInfo 物件呼叫 addLocalService()

如要透過 Wi-Fi 啟動附近裝置的探索作業,您必須先決定要使用 Bonjour 還是 Upnp 進行通訊。如要使用 Bonjour,請先使用 setDnsSdResponseListeners() 設定一些回呼事件監聽器,該方法會同時使用 WifiP2pManager.DnsSdServiceResponseListenerWifiP2pManager.DnsSdTxtRecordListener。如要使用 Upnp,請呼叫 setUpnpServiceResponseListener(),該函式會接收 WifiP2pManager.UpnpServiceResponseListener

您必須先呼叫 addServiceRequest(),才能開始在本機裝置上探索服務。當您傳遞至此方法的 WifiP2pManager.ActionListener 收到成功的回呼時,您就可以呼叫 discoverServices(),開始在本機裝置上探索服務。

發現本機服務後,您會收到 WifiP2pManager.DnsSdServiceResponseListenerWifiP2pManager.UpnpServiceResponseListener 的回呼,具體取決於您註冊的服務是 Bonjour 還是 Upnp。在上述兩種情況下,收到的回呼都包含代表對等裝置的 WifiP2pDevice 物件。

網路用量

新的 isActiveNetworkMetered() 方法可讓您檢查裝置目前是否已連線至計量付費上限的網路。在執行密集網路交易前檢查這項狀態,有助於管理可能讓使用者付費的數據用量,並可讓您明智地決定是否立即執行交易 (例如在裝置連上 Wi-Fi 時)。

無障礙設定

Accessibility service API

在 Android 4.1 中,無障礙服務 API 的觸及範圍已大幅增加。您現在可以透過新增 AccessibilityEventAccessibilityNodeInfoAccessibilityRecord 類別,建構可監控及回應更多輸入事件的服務,例如使用 onGesture() 和其他輸入事件的複雜手勢。

無障礙服務也可以代表使用者執行各種操作,包括使用 performActionsetMovementGranularities 點擊、捲動及逐步瀏覽文字。performGlobalAction() 方法還可讓服務執行「返回」、「主畫面」和「開啟最近使用的應用程式」等動作。

可自訂的應用程式導覽

建構 Android 應用程式時,您現在可以使用 findFocus()focusSearch() 尋找可聚焦元素和輸入小工具,並利用 setAccessibilityFocused() 設定焦點,藉此自訂導覽配置。

更容易存取的小工具

新的 android.view.accessibility.AccessibilityNodeProvider 類別可讓您將複雜的自訂檢視畫面顯示給無障礙服務,以便以更易於存取的方式呈現資訊。android.view.accessibility.AccessibilityNodeProvider 可讓使用者小工具 (含有日曆格線等進階內容) 為無障礙服務提供邏輯語意結構,而這與小工具的版面配置結構完全無關。這個語意結構可讓無障礙服務為視障使用者提供更實用的互動模式。

複製及貼上

使用意圖複製及貼上

您現在可以使用 setClipData() 方法,將 ClipData 物件與 Intent 建立關聯。這項功能在使用意圖將多個 content: URI 傳輸至其他應用程式時特別實用,例如共用多個文件時。以這種方式提供的 content: URI 也會遵循意圖的標記,提供讀取或寫入存取權,讓您授予意圖中的多個 URI 存取權。啟動 ACTION_SENDACTION_SEND_MULTIPLE 意圖時,意圖中提供的 URI 會自動傳播至 ClipData,讓接收器可以取得授予的存取權。

支援 HTML 和字串樣式

ClipData 類別現在支援樣式文字 (可做為 HTML 或 Android 樣式字串)。您可以使用 newHtmlText()ClipData 中加入 HTML 樣式文字。

RenderScript

強化了 Renderscript 運算功能,並包含下列功能:

  • 支援在單一指令碼中使用多個核心。
  • 在新的指令碼 API rsSample 中,支援使用計算機中的篩選器取樣器讀取配置。
  • 支援 #pragma 中不同層級的 FP 精確度。
  • 支援從運算指令碼查詢 RS 物件的其他資訊。
  • 多項效能改善。

您也可以使用新的 pragma 定義運算算繪指令所需的浮點精確度。如此便能在 CPU 路徑上啟用 NEON 等作業 (例如快速向量數學運算),這是完整 IEEE 754-2008 標準無法達到的成果。

注意:實驗性質的 Renderscript 圖像引擎現已淘汰。

動畫

活動啟動動畫

您現在可以使用縮放動畫或自訂動畫啟動 Activity。如要指定所需動畫,請使用 ActivityOptions API 建構 Bundle,然後將其傳遞至啟動活動的任何方法 (例如 startActivity())。

ActivityOptions 類別會針對活動開啟時顯示的各種動畫類型提供不同方法:

makeScaleUpAnimation()
建立動畫,從螢幕上指定的起始位置和指定的起始大小,放大活動視窗。舉例來說,Android 4.1 的主畫面會在開啟應用程式時使用這個值。
makeThumbnailScaleUpAnimation()
建立從指定位置和提供的縮圖開始放大活動視窗的動畫。舉例來說,Android 4.1 的「最近使用的應用程式」視窗會在返回應用程式時使用這個視窗。
makeCustomAnimation()
建立由自有資源定義的動畫:定義活動開始和停止活動的動畫。

時間動畫

新的 TimeAnimator 提供簡單的回呼機制,並透過 TimeAnimator.TimeListener 在動畫的每個影格通知您。這個動畫師沒有時間長度、內插或物件值設定。事件監聽器的回呼會接收每個影格的資訊,包括總經過時間和自上一個動畫影格以來的經過時間。

使用者介面

通知

在 Android 4.1 中,您可以建立具有較大內容區域、大型圖片預覽畫面、多個動作按鈕和可設定優先順序的通知。

通知的樣式

新的 setStyle() 方法可讓您指定通知的三種新樣式之一,每種樣式都提供較大的內容區域。如要指定大型內容區域的樣式,請將 setStyle() 傳遞至下列其中一個物件:

Notification.BigPictureStyle
適用於附有大型圖片的通知。
Notification.BigTextStyle
適用於包含大量文字的通知,例如單一電子郵件。
Notification.InboxStyle
適用於包含字串清單的通知,例如多封電子郵件中的片段。
通知動作

無論通知使用的是一般或較大的樣式,現在都支援在通知訊息底部顯示最多兩個動作按鈕。

如要新增動作按鈕,請呼叫 addAction()。這個方法有三個引數:圖示的可繪製資源、按鈕的文字,以及定義要執行的動作的 PendingIntent

優先順序

您現在可以使用 setPriority() 設定優先順序,向系統提示通知的重要性,進而影響通知在清單中的順序。您可以傳遞由 Notification 類別中 PRIORITY_* 常數定義的五個不同優先順序等級之一。預設值為 PRIORITY_DEFAULT,兩個層級高於此值,兩個層級低於此值。

高優先順序通知是指使用者通常希望快速回應的通知,例如新的即時通訊、文字訊息或即將到來的活動提醒。低優先順序通知的範例包括已過期的日曆活動或應用程式促銷活動。

系統 UI 控制項

Android 4.0 (Ice Cream Sandwich) 新增了旗標,可用於控制系統 UI 元素的顯示方式,例如將系統列的外觀調暗,或讓系統列在手機上完全消失。Android 4.1 新增了幾個旗標,讓您可以透過呼叫 setSystemUiVisibility() 並傳遞下列旗標,進一步控制系統 UI 元素和活動版面配置的外觀:

SYSTEM_UI_FLAG_FULLSCREEN
隱藏非關鍵的系統 UI (例如狀態列)。如果活動在疊加模式下使用動作列 (透過啟用 android:windowActionBarOverlay),則此標記也會隱藏動作列,並在隱藏和顯示這兩者時,搭配使用協調動畫。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
將活動版面配置設為使用啟用 SYSTEM_UI_FLAG_FULLSCREEN 後可用的螢幕區域,即使系統 UI 元素仍顯示在畫面上。雖然系統 UI 會重疊部分版面配置,但如果您的應用程式經常使用 SYSTEM_UI_FLAG_FULLSCREEN 隱藏及顯示系統 UI,這項做法就很實用,因為這樣可避免每次系統 UI 隱藏或顯示時,版面配置都需要調整至新的版面配置邊界。
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
將活動版面配置設為使用啟用 SYSTEM_UI_FLAG_HIDE_NAVIGATION (Android 4.0 新增) 時可用的螢幕區域,即使系統 UI 元素仍可見也一樣。雖然部分版面配置會與導覽列重疊,但如果您的應用程式經常使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 隱藏及顯示導覽列,這項做法就很實用,因為這樣可避免每次導覽列隱藏或顯示時,版面配置都調整為新的版面配置邊界。
SYSTEM_UI_FLAG_LAYOUT_STABLE
如果您使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和/或 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,建議您新增這個標記,確保在您對檢視區塊呼叫 fitSystemWindows() 時,定義的邊界與可用的螢幕空間保持一致。也就是說,設定此標記後,fitSystemWindows() 會表現出系統 UI 元素的顯示設定,即使您已隱藏所有系統 UI 也一樣。

如要進一步討論其他相關的系統 UI 標記,請參閱 Android 4.0 中新增的標記。

遠端檢視畫面

GridLayoutViewStub 現在是可遠端設定的檢視畫面,因此您可以在應用程式小工具和通知自訂版面配置的版面配置中使用這些檢視畫面。

字型系列

Android 4.1 版新增了幾個 Roboto 字型樣式的變化版本,總共 10 個變化版本,而且所有的應用程式都能使用。您的應用程式現在可存取完整的淺色和濃縮變化版本。

以下為可用的 Roboto 字型完整變化版本:

  • 一般內容
  • 斜體
  • 粗體
  • 粗體
  • 淺色
  • 淺斜體
  • 精簡規則
  • 斜體斜體
  • 精簡粗體
  • 精簡粗斜體

您可以使用新的 fontFamily 屬性搭配 textStyle 屬性,套用上述任一內插器。

支援的 fontFamily 值如下:

  • "sans-serif":一般 Roboto
  • "sans-serif-light" (Roboto Light 專用)
  • "sans-serif-condensed" (適用於 Roboto Condensed)

接著,您可以使用 textStyle"bold""italic" 套用粗體和/或斜體。您可以同時套用這兩種屬性,如下所示:android:textStyle="bold|italic"

您也可以使用 Typeface.create()。例如 Typeface.create("sans-serif-light", Typeface.NORMAL)

輸入架構

多個輸入裝置

新的 InputManager 類別可讓您查詢目前已連結的一組輸入裝置,並註冊在新增、變更或移除新裝置時收到通知。如果您正在建構支援多位玩家的遊戲,且想要偵測連接的控制器數量,以及控制器數量變更的時間,這項功能就特別實用。

您可以呼叫 getInputDeviceIds() 來查詢所有已連線的輸入裝置。這會傳回整數陣列,每個整數都是不同輸入裝置的 ID。接著您可以呼叫 getInputDevice(),針對指定的輸入裝置 ID 取得 InputDevice

如要在新的輸入裝置連線、變更或中斷連線時收到通知,請實作 InputManager.InputDeviceListener 介面,並使用 registerInputDeviceListener() 註冊介面。

輸入控制器震動

如果已連結的輸入裝置有其專屬的震動功能,您現在只要在 InputDevice 上呼叫 getVibrator(),即可使用現有的 Vibrator API 控制這些裝置的震動。

權限

以下是新權限:

READ_EXTERNAL_STORAGE
提供外部儲存空間的受保護讀取存取權。在 Android 4.1 中,所有應用程式預設仍具有讀取權限。這項規定將在日後的版本中變更,要求應用程式使用此權限明確要求讀取存取權。如果應用程式已要求寫入存取權,也會自動取得讀取存取權。我們推出了新的開發人員選項,可啟用讀取存取權限制,讓開發人員針對 Android 日後的行為測試應用程式。
android.Manifest.permission.READ_USER_DICTIONARY
允許應用程式讀取使用者字典。這項功能僅適用於 IME 或字典編輯器 (例如「設定」應用程式)。
READ_CALL_LOG
允許應用程式讀取系統的通話記錄,其中包含來電和撥出電話的相關資訊。
WRITE_CALL_LOG
允許應用程式修改手機上儲存的系統通話記錄
android.Manifest.permission.WRITE_USER_DICTIONARY
允許應用程式寫入使用者的字詞字典。

裝置功能

Android 4.1 版針對專門在電視螢幕上顯示使用者介面的裝置,新增了功能宣告:FEATURE_TELEVISION。如要宣告應用程式需要電視介面,請使用 <uses-feature> 元素,在資訊清單檔案中宣告這項功能:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

這項功能將「電視」定義為一般客廳電視體驗:顯示在大螢幕上、使用者坐在遠處,主要輸入形式是類似於 D-Pad 的裝置,通常不會透過觸控或滑鼠/游標裝置。