原文:http://android.eoe.cn/topic/summary html
Android 4.1 (Jelly Bean)發佈了,此次發佈包含了一些性能及用戶體驗上面的優化。也爲用戶和開發人員添加了一些新的功能。本文主要介紹了一些對於開發人員來講比較關注或者說有用的api。 java
對於應用開發人員來講,Android 4.1裏面包括了SDK編譯包(能夠編譯你應用程序用於在android 4.1平臺上面運行),和一個能夠在模擬器中運行的系統鏡像。開發人員應該儘快下載SDK編譯包及系統鏡像,而且在Android 4.1平臺上面編譯與測試你的應用程序。若是想在Android 4.1平臺上面從事開發和測試工做,請使用Android SDK Manager來下載相關的最新內容。 android
經過指定的[http://developer.android.com/guide/topics/manifest/service-element.html#isolatedandroid:isolatedProcess=true]中的"<service>標籤,您的Service將在沒有自身權限的被隔離的用戶ID進程下運行。 設計模式
新的ComponentCallbacks2常數,例如TRIM_MEMORY_RUNNING_LOW和TRIM_MEMORY_RUNNING_CRITICAL在系統調用onLowMemory())方法以前就提供前臺進程的內存狀態。 api
新的getMyMemoryState(ActivityManager.RunningAppProcessInfo))方法容許您直接查詢通常的內存狀態。 數組
一個新的方法,acquireUnstableContentProviderClient())容許您可能以一種「不穩定」的方式訪問ContentProviderClient以致於若是這個content provider在工做,你的應用就不會崩潰。當你在用content provider在一個單獨應用交互的時候這個方法頗有用。 緩存
新的intent協議直接啓動動態壁紙預覽的activity來幫助用戶在不須要強迫離開您的程序就能簡單地選擇動態壁紙而且經過手機壁紙選擇器進行導航。
爲了啓動這個動態壁紙選擇器,經過一個使用ACTION_CHANGE_LIVE_WALLPAPER的intent和額外的一個以EXTRA_LIVE_WALLPAPER_COMPONENT做爲您指定的動態壁紙ComponentName的一個字符串來調用[startActivity()]方法 安全
Android4.1採用了更容易的實現向上導航的設計模式。你所須要作的就是在你的manifest文件之中把android:parentActivityName增長到每一個元素中去。這個系統經過該信息在當用戶按操做欄中向上按鈕(同時也完成當時的activity)來打開相應的活動。因此若是您爲每個activity都聲明瞭android:parentActivityName,您就不須要用onOptionsItemSelected())這個方法處理點擊操做欄的應用程序事件圖標————如今的系統處理這一事件,並恢復或創建適當的活動。 網絡
在某些特定狀況之下,當用戶經過一個「深潛」的intent進入你到您應用中的某一個activity就好像從其它應用程序的一個通知或者意圖中進入(就如設計指南中描述應用程序之間的導航那樣)。當用戶以這樣的方式進入您的activity,您的程序也許會有不天然的回棧的activity能夠用來恢復用戶導航。然而,當您爲您的activities提供android:parentActivityName這個屬性,系統會識別您的程序是否包含了返回堆棧的父類activities,若是沒有,系統將會爲您的程序構建一我的工合成的返回堆棧包含全部的父類activities。
注意:當用戶進入您應用中的一個深度的activity時而且在您的應用程序中建立一個新的任務,系統其實是將父類activities的的堆棧插入到這個任務中。正由於如此,按下「Back」按鈕也從父類的activities堆棧中導航返回。
當系統爲您的應用程序建立一個合成的回棧,它也有個基本的Intent來爲每個父類activity來建立一個新的實例。因此它沒有像你指望的那種以用戶天然的經過每個activity來進行導航的方式爲父類的activities保存狀態。若是任何的父類activities一般顯示一個依賴於用戶將要丟失的上下文的界面,那麼您應該在用戶從堆棧中導航返回的時候記錄下來。例如,若是一個用戶正在一個音樂的應用中瀏覽一個專輯,導航也許會爲帶他進入到一個列選選定的音樂流派的全部專輯的activity。在這種狀況之下,若是必須建立堆棧,您頗有必要通知這個父類的activity當前的這個專輯屬於什麼流派,以此來讓這個activity顯示正確的列表就好像用戶確實是從原來那個activity過來的同樣。爲了在一個合成的父類的activity中實現這些信息,您必須重寫這個onPrepareNavigateUpTaskStack())方法。該方法爲您提供了一個TaskStackBuilder對象以供系統建立來合成父類的activities。這個TaskStackBuilder對象包含系統用來建立每一個父類的activity的Intent對象。在您實現
onPrepareNavigateUpTaskStack())的方法的時候,你能夠修改對應的Intent來增長額外的數據使父類activity可以用來決定對應的上下文和顯示相應的界面。 app
當系統建立了這個TaskStackBuilder類以後,它會增長用來建立那些在他們邏輯順序從activity樹頂端開始的父類activities的Intent對象。所以,最後添加到內部數組的的Intent就是當前活動的直接父類。若是你想爲這個activity的父類修改這個Intent,首先要經過[http://developer.android.com/reference/android/app/TaskStackBuilder.html#getIntentCountgetIntentCount]方法來肯定這個數組的長度而且將值放在[http://developer.android.com/reference/android/app/TaskStackBuilder.html#editIntentAt(int)editIntentAt]方法之中。()
若是您的應用程序結構比較複雜,還有一些其餘可用的APIs來幫助你處理向上導航的行爲以及徹底定製合成的回棧。這些APIs中的一部分還給你一些額外的控制包括:
重寫這個方法是爲了當用戶按下「UP」按鈕時定義一些自定義的操做。
調用該方法是爲告終束當前的activity而且跳到根據提供的Intent所顯示的那個activity上去。若是這個activity在回棧中存在,可是不是最近的一個父類,那麼全部在當前activity和指定activity之間的其它的activities也所有結束。
調用這個方法類得到啓動在邏輯上是當前activity的父類的Intent。
調用此方法是用來查詢一個合層的回棧是否必須爲了導航來建立。若是一個合成的棧須要被建立就返回true,若是該堆棧存在就返回false。
調用該方法是爲告終束當前的activity和全部與當前activity有相同任務關係的全部父類activities。若是你重寫了默認的行爲例如onNavigateUp()),你應該在你建立一個基於向上導航合成的回棧使用該方法。
若是你須要徹底控制合成任務堆棧的建立的全部過程,就重寫該方法。若是你只是想簡單添加一些數據到你回棧的intent中去,你就應該重寫onPrepareNavigateUpTaskStack())這個方法。
然而,大部分的應用程序都不須要使用這些APIs或者實現onPrepareNavigateUpTaskStack())方法,可是能夠達這個到正確的行爲僅僅經過爲每個元素添加android:parentActivityName就好了。
MediaCodec類是用來爲低級別的媒體編碼和解碼的媒體編解碼器提供訪問。您能夠實例化一個MediaCodec類經過調用createEncoderByType())方法來進行對媒體文件進行編碼或者調用[http://developer.android.com/reference/android/media/MediaCodec.html#createDecoderByTypejava.lang.String)createDecoderByType)]來對媒體文件進行解碼。每個方法都要採起一個MIME類型爲你想要編碼或者解碼的媒體文件類型,例如「video/3gpp」或者「audio/vorbis」。(
在MediaCodec實例建立以後,你能夠調用android.view.Surface, android.media.MediaCrypto, int) configure()方法來指定例如媒體格式或者是否對內容加密的屬性。
不管你是對你的媒體文件進行編碼仍是解碼,在你建立MediaCodec實例後的其他進程都是同樣的。首先經過getInputBuffers())的方法得到輸入ByteBuffer對象的一個數組而後再經過getOutputBuffers())方法來得到一個輸出的ByteBuffer的對象數組。
當你準備好進行編碼或者解碼的時候,調用dequeueInputBuffer())方法來得到這個用來做爲媒體文件源碼的ByteBuffer(從輸入的buffers的數組中)的索引位置。在你使用帶有媒體文件源碼的ByteBuffer以後,經過調用int, int, long, int)queueInputBuffer()方法來釋放緩存區的全部權。
對輸出緩存區也是同樣的,調用long) dequeueOutputBuffer()方法來得到你接收到結果的ByteBuffer的索引位置。在你從ByteBuffer讀出輸出以後,經過調用boolean)releaseOutputBuffer()方法來釋放全部權。
你能夠結合MediaCrypto APIs,而不是正常的int, android.media.MediaCodec.CryptoInfo, long, int) queueInputBuffer()方法,經過調用int, int, long, int)queueSecureInputBuffer()的方法來處理媒體媒體編解碼器的加密數據。
想要了解更多關於如何使用編解碼器的信息,參見MediaCodec文檔。
新方法startRecording())容許你能夠在MediaSyncEvent的定義提示下的基礎上開始錄音。這個MediaSyncEvent指定一個當完成時就能自發觸動錄音機開始錄音的音頻對話(例如一個被MediaPlayer所定義的對話)。例如,您可使用這個功能播放提示音來表示一段錄音會話的開始,而後這個錄音就自動開始,因此你沒沒必要手動同步提示音和錄音開始的操做。
MediaPlayer這個類如今能夠處理帶內和帶外的文本軌道。帶內文本軌道就是一個MP4或3GPP的媒體源的文本軌道。帶外文本軌道能夠經過addTimedTextSource()這個方法來本看成一個外部的文本進行添加。在全部的外部文本軌道添加以後,調用android.net.Uri, java.lang.String)getTrackInfo()方法來對數據源中全部的可用的軌跡的列表進行刷新。
若是要用MediaPlayer這個類來設置軌道,你必須調用selectTrack())這個方法選擇你想要設置的軌道的索引位置。
當得知到這個文本軌道準備開始時,實現MediaPlayer.OnTimedTextListener這個接口而且把它傳到setOnTimedTextListener())方法中去。
AudioEffect這個類如今支持當捕獲到音頻時額外的的音頻預處理類型:
做爲聲學回聲消除器(AEC)的AcousticEchoCanceler這個類消除了從遠程捕捉到音頻信號上的信號的做用。
做爲自動增益控制(AGC)的AutomaticGainControl這個類自動恢復正常捕獲的信號輸出。
做爲噪聲抑制器的(NS)的NoiseSuppressor這個類能夠消除被捕獲信號的背景噪音。
您能夠應用這些利用AudioEffect一個子類的AudioRecord類上的音頻捕獲預處理效果。
注意:並不能保證全部的設備都能支持這些效果的,因此你應該首先調用在對應音頻效果類上的[http://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html#isAvailableisAvailable]的方法來檢測它的可用性。()
如今您能夠在兩個徹底獨立的MediaPlayer類上執行無縫播放。在您第一個MediaPlayer類執行結束前的任什麼時候間調用setNextMediaPlayer())這個方法,而後Android系統將會在您第一個中止的時候緊接着播放第二個文件。
媒體路由器。這個新的APIs MediaRouter,MediaRouteActionProvider和MediaRouteButton爲您在播放文件的地方提供標準的機制和界面供您選擇。
新增接口Camera.AutoFocusMoveCallback,容許你監聽自動對焦動做。你可使用setAutoFocusMoveCallback())註冊你的接口。以後,當照相機處於持續自動對焦模式下(FOCUS_MODE_CONTINUOUS_VIDEO或者FOCUS_MODE_CONTINUOUS_PICTURE),你會收到一個android.hardware.Camera) onAutoFocusMoving()的回調。這個回調方法告訴你自動對焦是否已經開始移動或者已經中止。
MediaActionSound類提供了一個簡單的API集,用於發出由相機或者其餘媒體建立的聲音。當拍照或者攝像的時候,你應當使用這些API播放適當的聲音。
當播放聲音時,只要使用一個MediaActionSound對象,調用load())預加載須要的音頻,而後在適當的時間調用play())便可。
Android Beam™ 如今支持藍牙設備上的大數據量傳輸。當你使用新的[http://developer.android.com/reference/android/nfc/NfcAdapter.html#setBeamPushUrisandroid.net.Uri[](, android.app.Activity) setBeamPushUris()]方法或者新的回調接口NfcAdapter.CreateBeamUrisCallback定義待傳輸的數據,Android會關閉藍牙或者另外一個交互傳輸系統的數據傳輸,以取得更高的傳輸速度。這對大數據量特別有效,好比圖像和影像文件,而且不須要在設備間進行顯式的配對。這不須要你的應用來作更多的工做就可以發揮藍牙傳輸的優點。
[http://developer.android.com/reference/android/nfc/NfcAdapter.html#setBeamPushUrisandroid.net.Uri[](, android.app.Activity) setBeamPushUris()]方法用一個Uri對象的數組以指定在應用中想要傳輸的數據。另外,你也能夠實現NfcAdapter.CreateBeamUrisCallback接口。這樣,你就可以經過調用android.app.Activity) setBeamPushUrisCallback()方法爲你的activity指定數據。
當使用這個回調接口時,用戶每次使用Android Beam執行了一次共享,系統會調用接口的createBeamUris())方法以便於你可以定義須要共享的URI。對於待分享的URI會隨着activity中的用戶環境變化而變化的狀況下,這是有用的。反之,若是待分享的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接收到發現服務的回調時,你須要經過調用android.net.nsd.NsdManager.ResolveListener) resolveService()解析服務。調用時,傳遞一個NsdManager.ResolveListener的實現(這個實現接收包含已發現服務的信息的一個NsdServiceInfo)。調用這個方法容許你初始化鏈接。
Wi-Fi Direct API在Android 4.1中被加強以支持在WifiP2pManager中的預先關聯服務發現。這容許在鏈接以前使用Wi-Fi Direct經過服務發現和篩選周圍的設備。與此同時,Network Service Discovery容許你在一個已存在並保持鏈接的網絡上發現一個服務(例如一個本地的Wi-Fi網絡)。
爲了廣播你的應用做爲一個Wi-Fi上的服務,以便於其餘設備可以發現並鏈接你的應用,須要調用addLocalService())方法並傳輸一個[http://developer.android.com/reference/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.htmlWifiP2pServiceInfo]對象。這個對象描述了你的應用服務。
爲了經過Wi-Fi開始發現附近的設備,首先你應當決定使用Bonjour仍是Upnp實現通訊。若是使用Bonjour,首先要用setDnsSdResponseListeners())設置好一些回調監聽器。這個方法須要WifiP2pManager.DnsSdServiceResponseListener和[http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.DnsSdTxtRecordListener.htmlWifiP2pManager.DnsSdTxtRecordListenerUpnp,則要調用[setUpnpServiceResponseListener()](http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html#setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel,%20android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener))。這個方法須要一個[http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.UpnpServiceResponseListener.htmlWifiP2pManager.UpnpServiceResponseListener]做爲參數。]兩個做參數。若是使用
當本地服務被發現,你會收到一個回調,來自WifiP2pManager.DnsSdServiceResponseListener或者WifiP2pManager.UpnpServiceResponseListener,這個取決於你註冊使用的是Bonjour仍是Upnp。收到的回調都會包含一個WifiP2pDevice對象,表明了對應的設備。
新的方法isActiveNetworkMetered())容許你檢查設備當前是否正確鏈接到metered網絡。在執行網絡事務以前,檢查這個狀態,能夠幫助你管理數據的使用(那可能會消耗你的用戶的金錢)以及幫助你對是否當即執行事務作出更好的決定(例如當設備將要鏈接到Wi-Fi的時候)。
在Android 4.1中,可訪問性服務API被大大加強了。它容許你構建服務,該服務能夠監視並回應更多輸入事件,好比複雜的手勢使用onGesture())、其餘的輸入事件經過添加AccessibilityEvent, AccessibilityNodeInfoand AccessibilityRecord類來實現.
可訪問性服務能夠模擬用戶來執行一些操做,好比點擊、滾動和經過使用performAction)和setMovementGranularities)來實現文本的滾動。performGlobalAction())也容許服務模擬其餘的操做,好比返回、回到主屏幕、打開最進訪問的應用列表和通知欄等。
當編譯一個Android應用程序時,經過找到焦點元素和輸入控件來自定義導航方案,須要用到findFocus())和focusSearch())方法,設置焦點須要使用setAccessibilityFocused())方法。
新的android.view.accessibility.AccessibilityNodeProvider
類利用可訪問性服務容許你對複雜的自定義界面作處理,因此能夠以更方便的方式呈現信息。android.view.accessibility.AccessibilityNodeProvider
類容許一個具備先進的內容的widget(好比一個日曆網格)利用獨立完成的佈局結構去展現一個複雜語義結構。這個語義結構容許可訪問性服務爲在同一時刻的用戶展現一個更有用的互動模型。
你如今可使用setClipData()方法把一個ClipData對象關聯到一個Intent上。當你使用一個Intent傳輸複雜content:URI到另外一個應用程序時,這很是有用。例如當須要共享複雜文檔時。以content:URI這種形式給出的URI也遵循Intent的標記,提供讀寫的訪問權限,容許你在這個Intent中授予對複雜URI的訪問權限。當啓動一個ACTION_SEND或者ACTION_SEND_MULTIPLE的Intent,在Intent給出的URI會自動複製到ClipData,以便於接受者能夠有權限訪問它們。
ClipData類如今可以支持包含樣式的文本(包括HTML和Android樣式的字符串)。你能夠調用java.lang.CharSequence, java.lang.String) newHtmlText()方法添加HTML樣式本文到ClipData類。
Renderscript計算功能增長了如下特性:
一個腳本支持多個核心程序
支持使用經過新的API rsSample腳本計算獲得的過濾採樣器的分配閱讀。
在#pragma支持使用不一樣版本精度的FP。
經過一個計算腳本,容許從RS對象請求附加信息。
多個性能提高。
新的編譯註解還可用來定義計算Renderscripts時所要求的浮點型精度。這個容許你使用NEON進行運算,如在CPU路徑上的快速向量數學運算,但這個在完整的IEEE 754-2008標準中是不可能的實現的。
你如今可使用縮放動畫或你本身定義的動畫來啓動一個活動-Activity。指定一個你想要的動畫,可使用ActivityOptions APIs來創建一個Bundle,而後你能夠把它傳遞給任何一個用來啓動一個活動的方法,如startActivity())
ActivityOptions類爲你想要展現並打開的活動的每一種類型的動畫都準備了一個不一樣的方法。
:建立一個動畫,可以從屏幕指定的位置和指定的大小拉伸一個活動窗口。例如,當打開一個應用時,Android 4.1的主屏幕使用了這個方法。
makeThumbnailScaleUpAnimation())
:建立一個動畫,可以從屏幕指定的位置和提供的縮略圖拉伸一個活動窗口。例如,在Android 4.1的最近使用程序窗口中,當往回一個應用程序時使用了這個動畫。
:建立一個動畫,由你本身的資源所定義:一個用來定義活動開啓的動畫,一個用來定義活動被關閉的動畫。
新的TimeAnimator提供了一個簡單的回調機制,經過TimeAnimator.TimeListener,在動畫的每一幀處通知你。這個動畫器沒有時間,插值或是對象值設定。回調監聽器爲每一幀動畫接受信息,包括總運行時間和從前一幀到如今的運行時間。
在Android 4.1中,你能夠建立通知欄,使用更大的內容區域,大圖標預覽,多動做按鈕,和可配置的優先級。
新的方法setStyle()),容許你爲你的通知設定三個新的樣式,每個都提供了一個更大的內容區域。爲更大的內容區域指定一個樣式,將setStyle()) 傳遞給之後的對象之一:
:用做包含了一個大圖標附近的通知。
:用做包含了不少文本的通知,例如一封郵件。
:用做包含了一個字符串列表的通知,例如來自多封郵件的片段。
如今在通知消息底部支持顯示兩個動做按鈕,無論你的通知使用的是普通或是更大的樣式。
添加一個動做按鈕,調用addAction())方法。這個方法使用了兩個參數,一個爲圖標準備的繪圖資源,爲按鍵準備的文本,和一個PendingIntent對象,定義了動做的表現。
你如今可使用setPriority())方法來告知系統,你的通知的重要性 影響其在列表中的順序,來設定優先級。你能夠傳遞在Notification類中,由PRIORITY_* 常量定義的五個不一樣的優先級之一。默認的是PRIORITY_DEFAULT,有兩個高於和兩個低於它的優先級。
高優先級通知是那些用戶通常狀況下想要快速回復的通知,如一條即時信息,一條文本信息,或即時事件提醒。低優先級通知爲……(官網文檔缺失)。
Android 4.0(冰激凌三明治)添加了新的,用來控制系統UI元素可見性的標誌位,如使系統欄變暗,或是使其在手機上徹底消失。在Android 4.1中,添加了一些更多的標誌位,容許你進一步控制系統用戶界面的外觀和與它們相關的活動佈局,經過調用setSystemUiVisibility())方法並傳遞如下標誌位實現:
:隱藏非關鍵系統UI(如狀態欄)。若是你的活動使用了疊加模式的動做條(啓用android:windowActionBarOverlay),而後這個標誌位一樣隱藏動做條,並在使用一個協同動畫,同時隱藏和顯示兩個時也實現相同功能。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
:當你啓用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN時,將設置你的活動佈局使用相同的屏幕大小,即便系統UI元素仍然可見。雖然部分佈局會被系統UI疊加,但當你常常顯示和隱藏系統UI時,使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN將會很是有用,由於這避免了你的佈局須要在每次系統UI顯示和隱藏時從新調整新的佈局邊界。
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
:當你啓用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION(在Android 4.0時加入)時,將設置你的活動佈局使用相同的屏幕大小,即便系統UI元素仍然可見。雖然部分佈局會被導航條疊加,但當你常常顯示和隱藏系統UI時,使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION將會很是有用,由於這避免了你的佈局須要在每次導航條顯示和隱藏時從新調整新的佈局邊界。
:當使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和/或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION時,你可能會想要添加這個標誌來,來保證當在一個視圖中調用fitSystemWindows())方法時,其被定義的邊界始終保持不變,而且考慮可用的屏幕空間。也就是說,經過設置這個標誌位,fitSystemWindows())這個方法將表現爲,系統UI元素的可見性保持不變,即便你隱藏了所用的系統UI。
更多關於其它相關的系統UI標誌位的討論,請參考Android 4.0中的相關信息。
GridLayout和ViewStub如今可做爲遠程視頻,你能夠在你的應用程序小插件佈局和自定義通知佈局中使用它們。
Android 4.1帶來了幾種變體和Roboto風格等10種變體字體,而且它們都能被應用程序所使用。你的應用程序如今能夠訪問全系列的細體和長體字體。
全部可用的的Roboto變體字有:
常規
斜體
粗體
粗斜體
細體
細斜體
常規長體
長斜體
長粗體
長粗斜體
你能夠經過新的fontFamily屬性與textStyle屬性結合,應用上面的任何一種字體
fontFamily所支持的值有:
"scans-serif"爲常規的Roboto字體
"scans-serif-light"爲細體的Roboto字體
"scans-serif-condensed"爲長體的Roboto字體
而後能夠經過textStyle應用粗體和斜體,其值分別爲"italic"。你能夠經過如下方法同時應用兩種字體:。
你也可使用Typeface.create())方法。例如,Typeface.create("sans-serif-light", Typeface.NORMAL)
新的InputManager類容許你查詢一組當前鏈接的輸入設備,並註冊,當有新的設備被添加,更改,後移除時,獲得通知。這個功能很是有用,尤爲是在你想創建一個支持多用戶的遊戲,檢測有多少個控制器被接入而且控制器數量發生改變的狀況下特別有用。
你能夠經過調用getInputDeviceIds())方法來查詢全部被接入的輸入設備。而後你可能調用getInputDevice())方法得到某個指定設備ID的輸入設備-InputDevice
若是你想在有新的輸入設備被鏈接,更改,或斷開時獲得通知,實現InputManager.InputDeviceListener接口,並經過android.os.Handler) registerInputDeviceListener()註冊。
若是接入的輸入設備擁有震動功能,你如今能夠已存在的Vibrator APIs來控制這些設備的震動,只須要簡單的在這些輸入設備-InputDevice中調用getVibrator())方法。
如下是新添加的權限:
:爲外部存儲器提供了受保護的讀訪問權。在Android 4.1中,默認的,全部的應用程序依然有讀訪問權。在未來的版本中,這個將被改變爲要求應用程序顯式性地使用這個權限來得到讀訪問權。若是你的應用程序已經申請了寫訪問權,那麼其將自動得到讀訪問權。有一個新的開發者選項用來開啓讀訪問限制,對應於未來Android的表現,爲開發者測試他們的應用程序提供幫助。
:容許應用程序讀取用戶的字典。這個只應該由IME提出請求,或是一個字典編輯者,如Settings應用。
:容許應用程序讀取系統的電話日誌,包括全部的主叫和被叫電話。
:容許應用程序修改儲存於手機上的系統電話日誌。
:容許應用程序對用戶的詞典進行寫入。
Android 4.1爲製備提供了一個新的功能申明:FEATURE_TELEVISION,致力於在電視屏幕上顯示用戶界面。申明應用程序須要一個電視接口,在manifest文檔中使用元素來申明這個功能。
...
這個功能定義的「電視」爲典型的客廳電視:在一個大屏幕上顯示,用戶坐在離屏幕比較遠的地方,而且主要的輸入方法更向一個方向鍵,而通常不是經過觸摸屏或是鼠標/指示性設備。