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,同時支援舊版,方法是在程式碼中新增條件,用於檢查系統 API 級別,然後再執行 minSdkVersion 不支援的 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 版可讓您更輕鬆地為 Up 導覽實作適當的設計模式。您只需將 android:parentActivityName 新增至資訊清單檔案中的每個 <activity> 元素即可。當使用者按下動作列中的向上按鈕時 (同時也完成目前的活動),系統會使用此資訊開啟適當的活動。因此,如果您為每個活動宣告 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 的隔音 Echo 取消者 (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 BeamTM 現已支援透過藍牙傳輸大量酬載。使用新的 setBeamPushUris() 方法或新的回呼介面 NfcAdapter.CreateBeamUrisCallback 定義要轉移的資料時,Android 會處理轉移至藍牙或其他替代傳輸作業,以達到更快的傳輸速度。這對於圖片和音訊檔案等大型酬載而言特別實用,而且裝置之間不需要明顯的配對連線。您的應用程式不需要進行額外操作,即可利用藍牙傳輸內容。

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

使用回呼介面時,當使用者與 Android Beam 執行共用項目時,系統會呼叫介面的 createBeamUris() 方法,方便您定義在分享時分享的 URI。如果要共用的 URI 可能會因活動中的使用者情境而有所不同,這項做法就很實用;而在要共用的 URI 未變更時,呼叫 setBeamPushUris() 就能派上用場,而且您可以事先安全地定義這些 URI。

網路服務搜尋

Android 4.1 版開始支援多點傳播 DNS 服務探索,可讓您尋找並連線至 Wi-Fi 點透過 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 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 服務 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 精確度。
  • 支援透過 Compute 指令碼查詢 RS 物件的其他資訊。
  • 大幅提升效能。

您也可以使用新的 pragmas 來定義運算 Renderscript 所需的浮點精確度。這樣一來,您就能啟用 NEON 等作業,例如 CPU 路徑上的快速向量數學運算,這類運算在完整 IEEE 754-2008 標準中無法實現。

注意:實驗性 Renderscript 圖形引擎現已淘汰。

動畫

活動啟動動畫

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

ActivityOptions 類別包含不同的方法,可用於在活動開啟時呈現的每種動畫類型:

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

時間動畫師

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

使用者介面

通知

在 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() 時,定義的邊界會遵循可用螢幕空間一致。也就是說,設定此旗標後,即使在您隱藏所有系統 UI 後,fitSystemWindows() 仍會照常運作,也就是系統 UI 元素的瀏覽權限。

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

遠端檢視畫面

GridLayoutViewStub 現已設計可重新調整的檢視畫面,方便您在應用程式小工具和通知自訂版面配置的版面配置中使用。

字型系列

Android 4.1 新增了多個 Roboto 字型樣式變化版本,總共 10 個變化版本,這些變化版本全都可供應用程式使用。您的應用程式現在可以存取整組淺色和精簡變化版本。

可用的 Roboto 字型變化版本組合如下:

  • 一般內容
  • 斜體
  • 粗體
  • 粗斜體
  • 淺色
  • 淺斜體
  • 精簡版一般
  • 斜體斜體
  • 精簡粗體
  • 精簡的粗體斜體

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

支援的 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() 註冊。

輸入控制器的震動

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

權限

以下是新權限:

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,通常不會透過觸控或指標裝置操作。