原文API級別:16
Android 4.1([JELLY_BEAN](https://developer.android.com/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN))是一個平臺的進步,提供了改進的性能和增強的用戶體驗。它為用戶和應用程序開發人員增加了新功能。本文檔為應用程序開發人員介紹了最值得注意和有用的新API。
> 聲明您的應用程序API級別
> 為了更好地為運行Android 4.1的設備優化您的應用程序,您應該設置[targetSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#target)為 "16",將其安裝在Android 4.1系統映像上,對其進行測試,然后使用此更改發布更新。
> 您可以在Android 4.1中使用API,同時還可以通過在代碼中添加條件來檢查系統API級別,然后執行不支持的API [minSdkVersion](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#min)。要了解有關維護向后兼容性的更多信息,請閱讀[創建向后兼容的UI](https://developer.android.com/training/backward-compatible-ui/index.html)。
> 關于API級別如何工作的更多信息可以在[什么是API級別](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels)?
作為一名應用程序開發人員,您可以從[SDK Manager](https://developer.android.com/tools/help/sdk-manager.html)中獲得Android 4.1 作為系統映像,您可以在Android模擬器和SDK平臺上運行,以便構建您的應用程序。您應該盡快下載系統映像和平臺,以在Android 4.1上構建和測試您的應用程序。
### **應用組件**
#### **隔離的服務**
通過[android:isolatedProcess="true"](https://developer.android.com/guide/topics/manifest/service-element.html#isolated)在 [`<service>`](https://developer.android.com/guide/topics/manifest/service-element.html)標簽中指定,您[Service](https://developer.android.com/reference/android/app/Service.html)將在自己的獨立用戶標識進程下運行,而不需要自己的權限。
#### **內存管理**
在系統調用之前,新的[ComponentCallbacks2](https://developer.android.com/reference/android/content/ComponentCallbacks2.html)常量例如[TRIM_MEMORY_RUNNING_LOW](https://developer.android.com/reference/android/content/ComponentCallbacks2.html#TRIM_MEMORY_RUNNING_LOW)和[TRIM_MEMORY_RUNNING_CRITICAL](https://developer.android.com/reference/android/content/ComponentCallbacks2.html#TRIM_MEMORY_RUNNING_CRITICAL)提供前臺處理更多關于內存狀態的信息[onLowMemory()](https://developer.android.com/reference/android/app/Activity.html#onLowMemory())。
新的[getMyMemoryState(ActivityManager.RunningAppProcessInfo)](https://developer.android.com/reference/android/app/ActivityManager.html#getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo))方法允許你檢索一般的內存狀態。
#### **內容提供者**
一種新的方法,[acquireUnstableContentProviderClient()](https://developer.android.com/reference/android/content/ContentResolver.html#acquireUnstableContentProviderClient(android.net.Uri))允許你訪問一個[ContentProviderClient](https://developer.android.com/reference/android/content/ContentProviderClient.html)可能“不穩定”的東西,這樣如果內容提供者這樣做,你的應用就不會崩潰。當您在單獨的應用程序中與內容提供者交互時,這非常有用。
#### **動態壁紙**
新的意向協議,直接啟動動態壁紙預覽活動,所以你可以幫助用戶輕松地選擇你的動態壁紙,而不強迫他們離開你的應用程序,并通過家庭壁紙選擇器導航。
要啟動動態壁紙選取器,請[startActivity()](https://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent))使用一個[Intent](https://developer.android.com/reference/android/content/Intent.html)使用 [ACTION_CHANGE_LIVE_WALLPAPER](https://developer.android.com/reference/android/app/WallpaperManager.html#ACTION_CHANGE_LIVE_WALLPAPER)和一個額外的指定您的動態壁紙[ComponentName](https://developer.android.com/reference/android/content/ComponentName.html)作為一個字符串[EXTRA_LIVE_WALLPAPER_COMPONENT](https://developer.android.com/reference/android/app/WallpaperManager.html#EXTRA_LIVE_WALLPAPER_COMPONENT)。
#### **應用程序堆棧導航**
Android 4.1使得為Up導航實現適當的設計模式變得更加容易。所有你需要做的就是添加[android:parentActivityName](https://developer.android.com/guide/topics/manifest/activity-element.html#parent)到[`<activity>`](https://developer.android.com/guide/topics/manifest/activity-element.html)清單文件中的每個元素。系統使用此信息在用戶按下操作欄中的“上”按鈕(同時也結束當前活動)時打開相應的活動。因此,如果您android:parentActivityName為每個活動聲明,則不需要該[onOptionsItemSelected()](https://developer.android.com/reference/android/app/Activity.html#onOptionsItemSelected(android.view.MenuItem))方法來處理操作欄的應用程序圖標上的點擊事件 - 系統現在處理該事件并恢復或創建適當的活動。
對于用戶通過“深潛”意圖(例如來自不同應用程序的通知或意圖(如在應用程序間[導航](https://developer.android.com/design/patterns/navigation.html#between-apps)的設計指南中所述))輸入您的應用程序活動之一的場景,這尤其強大。當用戶以這種方式輸入活動時,您的應用程序可能不會自然而然地擁有一堆可以在用戶導航時恢復的活動。但是,當您[android:parentActivityName](https://developer.android.com/guide/topics/manifest/activity-element.html#parent)為活動提供屬性時,系統會識別您的應用程序是否已經包含父活動的后退堆棧,如果沒有,則會構造一個包含所有父活動的合成后退堆棧。
> **注意**:當用戶在您的應用程序中輸入一個深度活動,并為您的應用程序創建一個新任務時,系統實際上會將該父活動堆棧插入到該任務中。因此,按“后退”按鈕也可以瀏覽父活動的堆棧。
當系統為您的應用程序創建一個合成后臺堆棧時,它會構建一個基本的 [Intent](https://developer.android.com/reference/android/content/Intent.html)創建每個父級活動的新實例。所以沒有保存的父活動的狀態,你希望用戶自然瀏覽每個活動的方式。如果任何父活動通常顯示取決于用戶上下文的UI,那么該上下文信息將會丟失,并且當用戶瀏覽堆棧時應該將其傳遞。例如,如果用戶正在查看音樂應用程序中的專輯,則向上導航可能會將其帶到列出所選音樂流派中的所有專輯的活動。在這種情況下,如果必須創建堆棧,則必須通知父活動當前相冊屬于哪種類型,以便父級可以顯示正確的列表,就好像用戶實際上來自該活動一樣。為了將這些信息傳遞給合成的家長活動,[onPrepareNavigateUpTaskStack()](https://developer.android.com/reference/android/app/Activity.html#onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder))方法。這為您提供了[TaskStackBuilder](https://developer.android.com/reference/android/app/TaskStackBuilder.html)系統創建的對象,以便合成父級活動。該[TaskStackBuilder](https://developer.android.com/reference/android/app/TaskStackBuilder.html)包含[Intent](https://developer.android.com/reference/android/content/Intent.html)系統用來創建每個父活動的對象。在你的實現中[onPrepareNavigateUpTaskStack()](https://developer.android.com/reference/android/app/Activity.html#onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder)),你可以修改適當[Intent](https://developer.android.com/reference/android/content/Intent.html)的添加額外的數據,父活動可以用來確定適當的上下文,并顯示適當的用戶界面。
當系統創建該對象時[TaskStackBuilder](https://developer.android.com/reference/android/app/TaskStackBuilder.html),它會[Intent](https://developer.android.com/reference/android/content/Intent.html)按照從活動樹頂部開始的邏輯順序添加用于創建父活動的對象。所以,最后一個Intent添加到內部數組是當前活動的直接父項。如果要修改[Intent](https://developer.android.com/reference/android/content/Intent.html)活動的父項,請首先確定數組的長度,[getIntentCount()](https://developer.android.com/reference/android/content/Intent.html)然后將該值傳遞給[editIntentAt()](https://developer.android.com/reference/android/app/TaskStackBuilder.html#editIntentAt(int))。
如果您的應用程序結構更為復雜,則還有其他幾個可用的API可用來處理Up導航的行為,并完全自定義合成背堆棧。一些給你額外控制的API包括:
* [onNavigateUp()](https://developer.android.com/reference/android/app/Activity.html#onNavigateUp())
當用戶按下“上”按鈕時,覆蓋此操作以執行自定義操作。
* [navigateUpTo(Intent)](https://developer.android.com/reference/android/app/Activity.html#navigateUpTo(android.content.Intent))
調用它來完成當前的活動并轉到提供的活動Intent。如果活動存在于后退堆棧中,但不是最接近的父活動,則當前活動與意圖指定的活動之間的所有其他活動也將完成。
* [getParentActivityIntent()](https://developer.android.com/reference/android/app/Activity.html#getParentActivityIntent())
調用這個來獲得Intent那個會啟動當前活動的邏輯父項。
* [shouldUpRecreateTask(Intent)](https://developer.android.com/reference/android/app/Activity.html#shouldUpRecreateTask(android.content.Intent))
調用此參數來查詢是否必須創建合成背堆棧以便向上導航。如果必須創建合成堆棧,則返回true;如果合適的堆棧已經存在,則返回false。
* [finishAffinity()](https://developer.android.com/reference/android/app/Activity.html#finishAffinity())
調用此方法來完成當前活動以及與當前活動鏈接的具有相同任務關系的所有父活動。如果您覆蓋默認行為(如,) [onNavigateUp()](https://developer.android.com/reference/android/app/Activity.html#onNavigateUp()),則應在上導航中創建合成背堆棧時調用此方法。
* [onCreateNavigateUpTaskStack](https://developer.android.com/reference/android/app/Activity.html#onCreateNavigateUpTaskStack(android.app.TaskStackBuilder))
如果需要完全控制如何創建綜合任務堆棧,則覆蓋此選項。如果你只是想添加一些額外的數據到你的后臺堆棧的意圖,你應該改寫[onPrepareNavigateUpTaskStack()](https://developer.android.com/reference/android/app/Activity.html#onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder))
但是,大多數應用程序不需要使用這些API或實現[onPrepareNavigateUpTaskStack()](https://developer.android.com/reference/android/app/Activity.html#onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder)),但可以簡單地通過添加[android:parentActivityName](https://developer.android.com/guide/topics/manifest/activity-element.html#parent)到每個[`<activity>`](https://developer.android.com/guide/topics/manifest/activity-element.html)元素來實現正確的行為。
### **多媒體**
#### **媒體編解碼器**
該[MediaCodec](https://developer.android.com/reference/android/media/MediaCodec.html)課程提供對低級媒體編解碼器的訪問,以對媒體進行編碼和解碼。您可以MediaCodec通過調用[createEncoderByType()](https://developer.android.com/reference/android/media/MediaCodec.html#createEncoderByType(java.lang.String))編碼媒體或調用[createDecoderByType()](https://developer.android.com/reference/android/media/MediaCodec.html#createDecoderByType(java.lang.String))解碼媒體來實例化一個媒體。這些方法中的每一個對于要編碼或解碼的媒體類型都采用MIME類型,例如"video/3gpp"或"audio/vorbis"。
通過[MediaCodec](https://developer.android.com/reference/android/media/MediaCodec.html)創建的實例,可以調用configure()指定媒體格式或內容是否加密等屬性。
無論是對媒體進行編碼還是解碼,創建完成后其余的過程都是一樣的[MediaCodec](https://developer.android.com/reference/android/media/MediaCodec.html)。首先調用[getInputBuffers](https://developer.android.com/reference/android/media/MediaCodec.html#getInputBuffers())()獲取輸入ByteBuffer 對象數組并[getOutputBuffers()](https://developer.android.com/reference/android/media/MediaCodec.html#getOutputBuffers())獲取輸出[ByteBuffer](https://developer.android.com/reference/java/nio/ByteBuffer.html)對象數組。
準備編碼或解碼時,請調用[dequeueInputBuffer()](https://developer.android.com/reference/android/media/MediaCodec.html#dequeueInputBuffer(long))以獲取[ByteBuffer](https://developer.android.com/reference/java/nio/ByteBuffer.html)(應該使用輸入緩沖區數組)的索引位置,以便在源媒體中進行輸入。在填充[ByteBuffer](https://developer.android.com/reference/java/nio/ByteBuffer.html)源媒體之后,通過調用釋放緩沖區的所有權[queueInputBuffer()](https://developer.android.com/reference/android/media/MediaCodec.html#queueInputBuffer(int, int, int, long, int))。
同樣,對于輸出緩沖區,請調用dequeueOutputBuffer()以獲取[ByteBuffer](https://developer.android.com/reference/java/nio/ByteBuffer.html) 您將收到結果的位置的索引位置。讀完輸出后ByteBuffer,通過調用釋放所有權releaseOutputBuffer()。
你可以通過調用處理在編解碼器加密的媒體數據queueSecureInputBuffer()與結合[MediaCrypto](https://developer.android.com/reference/android/media/MediaCrypto.html)的API,而不是正常,queueInputBuffer()。
有關如何使用編解碼器的更多信息,請參閱MediaCodec文檔。
#### **在提示上錄制音頻**
新的方法[startRecording()](https://developer.android.com/reference/android/media/AudioRecord.html#startRecording())可以讓你開始音頻記錄基于一個定義的提示[MediaSyncEvent](https://developer.android.com/reference/android/media/MediaSyncEvent.html)。所述MediaSyncEvent指定的音頻會議(由諸如一項所定義[MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html)),其中,當完成時,觸發音頻記錄開始記錄。例如,您可以使用此功能來播放指示錄制會話開始的音頻音調,錄音自動開始,因此您不必手動同步音調和開始錄音。
#### **定時文本軌道**
在MediaPlayer無論是在帶內和帶外文本軌道現在處理。帶內文本軌道在MP4或3GPP媒體源中成為文本軌道。可以通過addTimedTextSource()方法將帶外文本軌道添加為外部文本源。在添加了所有外部文本軌道源之后,[getTrackInfo()](https://developer.android.com/reference/android/media/MediaPlayer.html#getTrackInfo())應該調用以獲取數據源中所有可用軌道的刷新列表。
要設置要使用的音軌MediaPlayer,必須[selectTrack()](https://developer.android.com/reference/android/media/MediaPlayer.html#selectTrack(int))使用要使用的音軌的索引位置進行調用。
要在文本軌道準備播放時收到通知,請執行該 [MediaPlayer.OnTimedTextListener](https://developer.android.com/reference/android/media/MediaPlayer.OnTimedTextListener.html)界面并將其傳遞給setOnTimedTextListener()。
#### **音頻效果**
在[AudioEffect](https://developer.android.com/reference/android/media/audiofx/AudioEffect.html)類現在支持捕獲音頻時附加的音頻預處理類型:
* 聲學回聲[AcousticEchoCanceler](https://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html) 消除器(AEC)從所捕獲的音頻信號中消除從對方接收到的信號的貢獻。
* 自動增益控制(AGC)[AutomaticGainControl](https://developer.android.com/reference/android/media/audiofx/AutomaticGainControl.html) 自動標準化捕獲信號的輸出。
* 噪聲抑制器(NS)可[NoiseSuppressor](https://developer.android.com/reference/android/media/audiofx/NoiseSuppressor.html) 消除捕獲信號中的背景噪聲。
您可以將這些預處理器效果應用于[AudioRecord](https://developer.android.com/reference/android/media/AudioRecord.html)使用其中一個[AudioEffect](https://developer.android.com/reference/android/media/audiofx/AudioEffect.html) 子類捕獲的音頻。
> 注意:不能保證所有設備都支持這些效果,所以您應該首先通過調用[isAvailable()](https://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html#isAvailable())相應的音頻效果類來檢查可用性。
#### **無縫播放**
您現在可以在兩個單獨的[MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html)對象之間執行無間隙回放 。在第一次MediaPlayer結束之前的任何時候,通話setNextMediaPlayer()和Android都會在第一個玩家停止的時候嘗試啟動第二個玩家。
媒體路由器。新的API MediaRouter,MediaRouteActionProvider和MediaRouteButton提供了標準的機制和UI來選擇播放媒體的位置。
### **相機**
#### **自動對焦運動**
新的界面[Camera.AutoFocusMoveCallback](https://developer.android.com/reference/android/hardware/Camera.AutoFocusMoveCallback.html)允許您聽取自動對焦運動的變化。你可以注冊你的界面setAutoFocusMoveCallback()。然后,當相機處于連續自動對焦模式([FOCUS_MODE_CONTINUOUS_VIDEO](https://developer.android.com/reference/android/hardware/Camera.Parameters.html#FOCUS_MODE_CONTINUOUS_VIDEO)或 [FOCUS_MODE_CONTINUOUS_PICTURE](https://developer.android.com/reference/android/hardware/Camera.Parameters.html#FOCUS_MODE_CONTINUOUS_PICTURE))時,您將收到一個呼叫onAutoFocusMoving(),告訴您自動對焦是開始移動還是停止移動。
相機的聲音
該[MediaActionSound](https://developer.android.com/reference/android/media/MediaActionSound.html)課程提供了一套簡單的API來生成相機或其他媒體操作所產生的標準聲音。您應該使用這些API在構建自定義靜態攝像機或攝像機時播放適當的聲音。
要播放聲音,只需實例化一個MediaActionSound對象,調用 [load()](https://developer.android.com/reference/android/media/MediaActionSound.html#load(int))預加載所需的聲音,然后在適當的時候調用[play()](https://developer.android.com/reference/android/media/MediaActionSound.html#play(int))。
### **連接**
#### **Android Beam**
Android Beam?現在支持通過藍牙進行大量有效載荷傳輸。當您使用新setBeamPushUris() 方法或新回調界面定義要傳輸的數據時[NfcAdapter.CreateBeamUrisCallback](https://developer.android.com/reference/android/nfc/NfcAdapter.CreateBeamUrisCallback.html),Android會將數據傳輸轉移到藍牙或其他備用傳輸,以實現更快的傳輸速度。這對于諸如圖像和音頻文件之類的大型有效載荷特別有用,并且不需要設備之間的可見配對。您的應用不需要額外的工作來利用藍牙傳輸。
該setBeamPushUris()方法需要一個[Uri](https://developer.android.com/reference/android/net/Uri.html)對象數組 ,指定要從應用程序傳輸的數據。或者,您可以實現NfcAdapter.CreateBeamUrisCallback 可以通過調用為您的活動指定的界面setBeamPushUrisCallback()。
當使用回調接口時,[createBeamUris()](https://developer.android.com/reference/android/nfc/NfcAdapter.CreateBeamUrisCallback.html#createBeamUris(android.nfc.NfcEvent))當用戶使用Android Beam執行共享時,系統會調用接口的方法,以便您可以定義在共享時共享的URI。如果要共享的URI取決于活動中的用戶上下文,則setBeamPushUris()這非常有用,而當要共享的URI不變時,調用會很有用,您可以提前安全地定義它們。
#### **網絡服務發現**
Android 4.1增加了對組播基于DNS的服務發現的支持,允許您通過Wi-Fi查找并連接到對等設備提供的服務,例如移動設備,打印機,相機,媒體播放器以及其他本地注冊的服務網絡。
新的軟件包[android.net.nsd](https://developer.android.com/reference/android/net/nsd/package-summary.html)包含新的API,允許您在本地網絡上廣播您的服務,發現網絡上的本地設備,并連接到設備。
要注冊你的服務,你必須先創建一個[NsdServiceInfo](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html) 對象,并使用方法,如定義服務的各種屬性 [setServiceName()](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html#setServiceName(java.lang.String)), [setServiceType()](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html#setServiceType(java.lang.String))和 [setPort()](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html#setPort(int))。
那么你需要實現[NsdManager.RegistrationListener](https://developer.android.com/reference/android/net/nsd/NsdManager.RegistrationListener.html) 并傳遞給registerService() 你的[NsdServiceInfo](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html)。
發現網絡上的服務,實現[NsdManager.DiscoveryListener](https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener.html)并傳遞給它discoverServices()。
當您[NsdManager.DiscoveryListener](https://developer.android.com/reference/android/net/nsd/NsdManager.DiscoveryListener.html)收到有關找到的服務的回調時,您需要通過調用來解析該服務 resolveService(),并將其傳遞給[NsdManager.ResolveListener](https://developer.android.com/reference/android/net/nsd/NsdManager.ResolveListener.html)接收[NsdServiceInfo](https://developer.android.com/reference/android/net/nsd/NsdServiceInfo.html)包含有關發現的服務的信息的對象的實現,從而允許您啟動連接。
#### **Wi-Fi P2P服務發現**
在Android 4.1中增強了Wi-Fi P2P API,以支持預關聯服務發現WifiP2pManager。這允許您在連接到服務之前使用Wi-Fi P2P發現并過濾附近的設備,而網絡服務發現則允許您在現有連接的網絡(例如本地Wi-Fi網絡)上發現服務。
要通過Wi-Fi將應用程序作為服務廣播,以便其他設備可以發現您的應用程序并連接到該應用程序,請addLocalService()使用WifiP2pServiceInfo描述應用程序服務的 對象進行調用。
要通過Wi-Fi發現附近的設備,您需要先決定是否使用Bonjour或Upnp進行通信。要使用Bonjour,首先設置一些回調監聽器 setDnsSdResponseListeners(),同時使用a WifiP2pManager.DnsSdServiceResponseListener和WifiP2pManager.DnsSdTxtRecordListener。要使用Upnp,請使用 setUpnpServiceResponseListener()一個WifiP2pManager.UpnpServiceResponseListener。
在您開始在本地設備上發現服務之前,您還需要致電addServiceRequest()。當WifiP2pManager.ActionListener你通過這個方法接收到一個成功的回調,你就可以開始通過調用在本地設備上發現服務discoverServices()。
當發現本地服務時,您會收到WifiP2pManager.DnsSdServiceResponseListeneror 的回WifiP2pManager.UpnpServiceResponseListener叫,具體取決于您是否注冊使用Bonjour或Upnp。在任何情況下收到的回調都包含WifiP2pDevice代表對等設備的 對象。
#### **網絡使用**
新方法isActiveNetworkMetered()允許您檢查設備當前是否連接到一個測量網絡。通過在執行密集的網絡事務之前檢查此狀態,您可以幫助管理數據使用情況,這可能會使您的用戶花費金錢,并就現在或以后是否執行交易(例如設備連接到Wi-Fi時)做出明智的決定。
### **無障礙**
#### **輔助功能服務API**
在Android 4.1中,輔助功能服務API的覆蓋面已經顯著增加。現在允許你建立監測服務和更多的輸入事件,如使用復雜的手勢做出反應onGesture(),通過增加的和其他輸入事件AccessibilityEvent,AccessibilityNodeInfo以及AccessibilityRecord類。
輔助功能服務也可以代表用戶執行操作,包括使用performAction和單擊,滾動和逐步瀏覽文本setMovementGranularities。該performGlobalAction()方法還允許服務執行諸如“返回”,“主頁”以及打開“最近使用的應用程序和通知”等操作。
#### **可定制的應用程序導航**
在構建Android應用程序時,您現在可以通過使用findFocus()和找到可聚焦的元素和輸入小部件來自定義導航方案,并使用focusSearch()焦點setAccessibilityFocused()。
#### **更易于使用的小部件**
新android.view.accessibility.AccessibilityNodeProvider類允許您將復雜的自定義視圖顯示到可訪問性服務,以便以更易于訪問的方式呈現信息。在android.view.accessibility.AccessibilityNodeProvider允許用戶與小部件的高級內容,諸如日歷網格,以呈現一個邏輯語義結構的可訪問的服務,是從微件的布局結構完全分離的。這種語義結構允許無障礙服務為視力受損的用戶提供更有用的交互模式。
### **復制和粘貼**
#### **復制并粘貼意圖**
現在可以將ClipData對象與Intent使用該setClipData()方法的對象關聯起來。當使用意圖將多個content:URI 傳輸到另一個應用程序(例如共享多個文檔時)時,這是特別有用的。以content:這種方式提供的URI也將尊重意圖的標志以提供讀取或寫入訪問,允許您在意圖中授予對多個URI的訪問權限。當開始ACTION_SEND或ACTION_SEND_MULTIPLE意圖時,意圖中提供的URI現在自動傳播到ClipData接收者可以授予訪問權限。
#### **支持HTML和字符串樣式**
在ClipData類現在支持樣式文本(無論是作為HTML或Android 風格的字符串)。您可以HTML樣式的文本添加到ClipData同newHtmlText()。
#### **的renderScript**
Renderscript計算功能已增強,具有以下功能:
* 在一個腳本內支持多個內核。
* 支持從新的腳本API中通過計算過濾采樣器進行分配讀取 rsSample。
* 支持不同級別的FP精度#pragma。
* 支持從計算腳本查詢來自RS對象的附加信息。
* 許多性能改進。
新的pragmas也可以用來定義計算Renderscripts所需的浮點精度。這使您可以在CPU路徑上啟用NEON類似的操作,例如快速矢量數學運算,否則將無法使用完整的IEEE 754-2008標準。
> 注意:實驗Renderscript圖形引擎現在已被棄用。
### **動畫**
#### **活動啟動動畫**
您現在可以啟動Activity使用縮放動畫或您自己的自定義動畫。要指定所需的動畫,請使用ActivityOptionsAPI構建一個Bundle可以傳遞給啟動活動的任何方法的API ,例如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將action定義為perfrom的函數。
#### **優先級**
您現在可以通過設置優先級來向系統提示您的通知對通知在列表中的排序有多重要setPriority()。你可以在類中傳遞由PRIORITY_*常量定義的五個不同優先級中的一個Notification。默認是PRIORITY_DEFAULT,有兩個級別,兩個級別較低。
高優先級通知是用戶通常希望快速響應的事件,例如新的即時消息,文本消息或即將發生的事件提醒。低優先級通知就是過期的日歷活動或應用促銷活動。
#### **系統用戶界面的控件**
Android 4.0(冰淇淋三明治)添加了新的標志來控制系統UI元素的可見性,例如調暗系統欄的外觀或使其在手機上完全消失。Android 4.1增加了一些標志,通過調用setSystemUiVisibility() 和傳遞下列標志,可以進一步控制系統UI元素的外觀以及與之相關的活動布局:
* SYSTEM_UI_FLAG_FULLSCREEN
隱藏非關鍵系統UI(如狀態欄)。如果你的活動在疊加模式中使用了動作條(通過啟用android:windowActionBarOverlay),那么這個標志也隱藏了動作條,并且在隱藏和顯示兩者的情況下用協調的動畫來執行。
* SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
將活動布局設置為使用與啟用時相同的屏幕區域,SYSTEM_UI_FLAG_FULLSCREEN即使系統UI元素仍可見。雖然部分布局將被系統UI覆蓋,但是如果您的應用程序經常隱藏并顯示系統UI,則此部分很有用 SYSTEM_UI_FLAG_FULLSCREEN,因為每次系統UI隱藏或顯示時都會避免將布局調整為新的布局邊界。
* SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
SYSTEM_UI_FLAG_HIDE_NAVIGATION即使系統UI元素仍然可見,請將活動布局設置為使用啟用(在Android 4.0中添加)時可用的相同屏幕區域。盡管部分布局將被導航欄覆蓋,但如果您的應用程序經常隱藏并顯示導航欄,則這很有用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中添加的相關內容。
#### **遠程視圖**
GridLayout而ViewStub 現在遠程的意見,所以你可以在布局中使用他們為你的應用程序部件和通知自定義布局。
#### **字體家族**
Android 4.1增加了Roboto字體樣式的多個變體,共有10個變體,而且它們都可以被應用程序使用。您的應用程序現在可以訪問全套輕量級和濃縮型變體。
Roboto字體變體的完整集合是:
* 定期
* 斜體
* 膽大
* 加粗斜體
* 光
* 光斜體
* 濃縮正規
* 濃縮斜體
* 粗體粗體
* 濃縮的粗體 - 斜體
您可以將這些新fontFamily 屬性中的任何一個與屬性結合使用textStyle。
支持的值fontFamily是:
* "sans-serif" 對于經常Roboto
* "sans-serif-light" 為Roboto光
* "sans-serif-condensed" 為Roboto壓縮
然后,您可以應用粗體和/或傾斜的textStyle值 "bold"和"italic"。你可以這樣應用:android:textStyle="bold|italic"。
你也可以使用Typeface.create()。例如Typeface.create("sans-serif-light", Typeface.NORMAL)。
### **輸入框架**
#### **多個輸入設備**
新InputManager類允許您查詢當前連接的輸入設備集,并在添加,更改或刪除新設備時通知注冊。如果您正在構建支持多個玩家的游戲,并且想要檢測連接的控制器的數量以及控制器的數量發生了什么變化,這一點尤其有用。
您可以查詢通過呼叫連接的所有輸入設備 getInputDeviceIds()。這將返回一個整數數組,每個整數都是不同輸入設備的ID。然后可以調用 getInputDevice()獲取InputDevice指定的輸入設備ID。
如果您希望在新的輸入設備連接,更改或斷開連接時得到通知,請執行該InputManager.InputDeviceListener界面并注冊registerInputDeviceListener()。
#### **振動輸入控制器**
如果連接的輸入設備有自己的振動功能,現在可以控制使用現有的這些設備的振動Vibrator簡單地通過調用的API getVibrator()上InputDevice。
#### **權限**
以下是新的權限:
* 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](https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_TELEVISION)。要聲明您的應用程序需要電視界面,請在清單文件中使用以下[<uses-feature>](https://developer.android.com/guide/topics/manifest/uses-feature-element.html)元素聲明此功能:
~~~
<manifest ... >
<uses-feature android:name="android.hardware.type.television"
android:required="true" />
...
</manifest>
~~~
該特征將“電視”定義為典型的起居室電視體驗:顯示在大屏幕上,用戶坐在很遠的地方,輸入的主要形式是類似d-pad的東西,而且通常不是通過觸摸或鼠標/指示器裝置。
- 前言
- Google官網對Android API各版本的介紹
- jelly Bean(果凍豆)Android 4.1、4.2、4.3
- Android 4.1
- Android 4.2
- Android 4.3
- KitKat(Android 4.4.*)巧克力
- Android 4.4 APIS
- Lollipop(棒棒糖)Android 5.*
- Android 5.0 APIs
- Android 5.0 Changes(變更)
- Android 5.1APIs
- Marshmallow(棉花糖)Android 6.0
- Android 6.0 APIs
- Android 6.0 Changes(變更)
- Android 6.0 Samples
- Android 6.0 Testing
- Nougat(牛扎塘)Android 7.*
- Android 7.0
- API
- 行為變更
- 示例
- Android 7.1
- 開發者API
- 示例Sample
- Oreo(奧利奧)8.*
- Android 8.0
- 功能和 API
- Android 8.0 行為變更
- 向 Android 8.0 遷移應用
- Android 8.0 示例
- Android 8.1
- 后臺執行限制
- 后臺位置限制
- API指南
- Android 簡介
- 應用基礎知識
- 設備兼容性
- 系統權限
- 請求權限
- 定義權限
- 平臺架構
- Java8 概覽
- 在ART上驗證應用行為
- 應用組件
- Intent 和 Intent 過濾器(Google官網介紹)
- 通用intent
- Activity
- 任務和返回棧(官網譯文)
- 概覽屏幕
- 活動簡介
- 活動生命周期
- 活動狀態更改
- 進程和應用程序生命周期
- 包裹和捆綁
- 最近的屏幕
- 片段
- 加載器
- 服務Service
- 綁定服務
- AIDL
- 內容提供程序
- 內容提供程序基礎知識
- 創建內容提供程序
- 日歷提供程序
- 聯系人提供程序
- 存儲訪問框架
- 使用存儲訪問框架打開文件
- 創建自定義文檔提供程序
- 應用小部件
- 應用小部件主機
- 進程和線程
- 應用資源
- 概覽
- 提供資源
- 訪問資源
- 處理運行時變更
- 本地化
- ICU4J Android框架API
- Android上的國際化
- 語言和語言區域
- 復雜的XML資源
- 資源類型
- 動畫
- 顏色狀態列表
- 可繪制對象
- 布局
- 菜單
- 字符串
- 樣式
- 其他類型
- 應用清單
- <action>
- <activity>
- <activity-alias>
- <application>
- <category>
- <compatiable-screens>
- <data>
- <grant-uri-permission>
- <intent-filter>
- <manifest>
- <meta-data>
- <path-permission>
- <permission>
- <permission-group>
- <permission-tree>
- <provider>
- <receiver>
- <service>
- <supporte-gl-texture>
- <supports-screens>
- <uses-configuration>
- <uses-feature>
- <uses-library>
- <uses-permission>
- <uses-permission-sdk-23>
- <uses-sdk>
- 用戶界面
- 界面概覽
- 界面布局
- 線性布局
- 相對布局
- 列表視圖
- 網格視圖
- 回收站視圖
- 外觀和感覺
- 可下載的字體
- XML中的字體
- 表情符號兼容性
- 自動調整TextView
- 樣式和主題-
- 輸入控件
- 按鈕
- 文本字段
- 復選框
- 單選按鈕
- 切換按鈕
- 微調框
- 選取器
- 輸入事件
- 菜單Menu
- 設置
- 對話框
- 通知
- Toast
- 自適應圖標
- 應用快捷方式
- 搜索
- 創建搜索界面
- 添加近期查詢建議
- 添加自定義建議
- 可搜索配置
- 多窗口支持
- 拖放
- 無障礙功能
- 為應用設置無障礙功能
- 無障礙功能開發者檢查單
- 構建無障礙服務
- 讓應用更容易訪問
- 使用節點樹調試
- 構建可訪問自定義視圖
- 樣式和主題
- 自定義組件
- 動畫和圖形
- 概覽介紹
- 屬性動畫
- 視圖動畫
- 可繪制動畫
- 畫布和可繪制對象
- 基于物理的動畫
- Spring Animation
- Fling Animation
- OpenGL ES
- 硬件加速
- 計算
- RenderScript
- 高級RenderScript
- Runtime API Reference(參考)
- Numerical Types(數字類型)
- Object Types(對象類型)
- Conversion Functions(轉換函數)
- Mathematical Constants and Functions(數學常量和函數)
- Vector Math Functions(矢量數學函數)
- Matrix Functions(矩陣函數)
- Quaternion Functions(四元數函數)
- Atomic Update Functions(原子更新函數)
- Time Functions and Types(時間函數和類型)
- Allocation Data Access Functions(分配數據訪問函數)
- Object Characteristics Functions(對象特性函數)
- Kernel Invocation Functions and Types(內核調用函數和類型)
- Input/Output Functions(輸入輸出函數)
- Debugging Functions(調試函數)
- Graphics Functions and Types(圖形函數和類型)
- Index(索引)
- Media Apps(媒體應用)
- Media Apps Overview(媒體應用程序概述)
- Working with a Media Session(使用媒體會話)
- Building an Audio App(建立一個音頻應用)
- Building a Media Browser Service(構建媒體瀏覽器服務)
- Building a Media Browser Client(構建媒體瀏覽器客戶端)
- Media Session Callbacks(媒體會話回調)
- Building a Video App(建立一個視頻應用)
- Building a Video Player Activity(建立一個視頻播放器Activity)
- Media Session Callbacks-(媒體會話回調)
- Responding to Media Buttons(響應媒體按鈕)
- Handling Changes in Audio Output(處理音頻輸出的變化)
- Managing Audio Focus(管理音頻焦點)
- The Google Assistant and Media Apps(Google智能助理和媒體應用)
- 媒體和相機
- Supported Media Formats(支持的媒體格式)
- MediaPlayer(媒體播放器)
- MediaRecorder
- ExoPlayer
- Controller Amplitude with VolumeShaper(VolumeShaper控制器振幅)
- Media Routing(媒體路由)
- MediaRouter API
- MediaRouteProvider API
- Camera API(相機API)
- 位置和傳感器
- Location and Maps(位置和地圖)
- Location Strategies(位置策略)
- Sensors Overview(傳感器概覽)
- Motion Sensors(運動傳感器)
- Position Sensors(位置傳感器)
- Environment Sensors(環境傳感器)
- Raw GNSS Measurements(原始的GNSS測量)
- 連接
- Bluetooth
- Bluetooth Low Energy(藍牙低功耗)
- NFC
- NFC Basics(NFC基礎知識)
- Advanced NFC(高級NFC)
- Host-based Card Emulation(基于主機的卡模擬)
- Telecom(電信)
- Self-Managed ConnectionServices(自我管理的連接服務)
- Wi-Fi P2P
- Wi-Fi Aware
- Companion Device Pairing
- USB
- Accessory(配件)
- Host(主機)
- SIP
- 文本和輸入
- Autofill Framework(自動填充框架)
- Test your app with autofill(使用自動填充測試你的應用)
- Building autofill services(構建自動填充服務)
- Copy and Paste(復制和粘貼)
- Creating an IME(創建IME)
- Image Keyboard(圖像鍵盤)
- Spelling Checker(拼寫檢查程序)
- 數據存儲
- Storage Options(存儲選項)
- Data Backup(數據備份)
- Account Transfer API(賬戶轉移API)
- Auto Backup(自動備份)
- Key/Value Backup(鍵值備份)
- Testing Backup and Restore(測試備份和還原)
- App Install Location(應用安裝位置)
- 庫
- 支持庫
- 功能
- 修訂歷史記錄
- 庫設置
- 數據綁定庫
- 測試支持庫
- 管理
- 設備策略
- 網絡應用
- Supporting Different Screens in Web Apps(在網絡應用中支持不同屏幕)
- Building Web Apps in WebView(在WebView中構建網絡應用)
- Managing WebViews
- Migrating to WebView in Android 4.4(遷移到Android4.4中的WebView)
- Debugging Web Apps(調試網絡應用)
- Best Practices for Web Apps(網絡應用最佳做法)
- 最佳實踐
- Supporting Multiple Screens(支持多種屏幕)
- Distributing to Specific Screens(分配到特定屏幕)
- Screen Compatibility Mode(屏幕兼容性模式)
- Designing for Seamlessness
- Supporting Tablets and Handsets
- 培訓