API等級:18
Android 4.3(JELLY_BEAN_MR2)是Jelly Bean版本的更新,為用戶和應用程序開發人員提供了新功能。本文檔介紹了最值得注意的新API。
作為應用程序開發人員,您應該盡快從SDK Manager中下載Android 4.3系統映像和SDK平臺。如果您沒有運行Android 4.3的設備來測試您的應用,請使用Android 4.3系統映像在Android模擬器上測試您的應用。然后根據Android 4.3平臺構建您的應用程序,以開始使用最新的API。
#### **更新您的目標API級別**
為了更好地為運行Android 4.3的設備優化您的應用程序,您應該設置targetSdkVersion為 "18",在Android 4.3系統映像上安裝它,對其進行測試,然后使用此更改發布更新。
您可以使用Android 4.3中的API,同時還可以通過在代碼中添加條件來檢查系統API級別,然后執行不受您的支持的API minSdkVersion。要了解更多關于保持向后兼容性,閱讀支持不同平臺版本。
Android 支持庫中還提供了各種API ,使您可以在舊版本的平臺上實現新功能。
有關API級別如何工作的更多信息,請閱讀什么是API級別?
#### **重要的行為變化**
如果您以前發布過Android版應用,請注意您的應用可能會受到Android 4.3更改的影響。
#### **如果你的應用程序使用隱含的意圖...**
您的應用在受限個人資料環境中可能會行為不當。
受限制的配置文件環境中的用戶可能沒有可用的所有標準Android應用程序。例如,受限制的配置文件可能會禁用Web瀏覽器和相機應用程序。因此,您的應用程序不應該假設哪些應用程序可用,因為如果您在startActivity()未驗證應用程序是否可用來處理的情況下調用Intent,則您的應用程序可能會在受限制的配置文件中崩潰。
當使用隱式意圖時,您應該始終通過調用resolveActivity()或來驗證應用程序是否可用來處理意圖queryIntentActivities()。例如:
~~~
Intent intent = new Intent(Intent.ACTION_SEND);
...
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show();
}
~~~
#### **如果你的應用程序依賴于帳戶...**
您的應用在受限個人資料環境中可能會行為不當。
受限制的配置文件環境中的用戶默認無權訪問用戶帳戶。如果您的應用程序依賴于某個應用程序Account,那么您的應用程序在受限制的配置文件中使用時可能會意外崩潰
如果您希望防止受限制的配置文件完全使用您的應用,因為您的應用依賴于敏感的帳戶信息,請android:requiredAccountType在清單`<application>` 元素中指定該屬性。
如果您希望允許受限個人資料繼續使用您的應用,即使他們無法創建自己的帳戶,也可以禁用需要帳戶的應用功能或允許受限個人資料訪問由主要用戶創建的帳戶。有關更多信息,請參閱以下有關在受限個人資料中支持帳戶的部分。
#### **如果您的應用程序使用VideoView ...**
在Android 4.3上,您的視頻可能會顯得較小。
在以前的Android版本中,VideoView小部件錯誤地計算了"wrap_content"值layout_height并layout_width與之相同"match_parent"。因此,在使用"wrap_content"高度或寬度時,可能以前提供了您所需的視頻布局,這樣做可能會導致Android 4.3及更高版本上的視頻小得多。要解決此問題,替換 "wrap_content"與"match_parent"和驗證在Android 4.3以及對舊版本如預期的視頻出現。
### **受限制的配置文件**
在Android平板電腦上,用戶現在可以基于主要用戶創建受限的配置文件。當用戶創建一個受限制的配置文件時,他們可以啟用限制,比如哪個應用程序可用于配置文件。Android 4.3中的一組新的API還允許您為開發的應用程序構建精細限制設置。例如,通過使用新的API,您可以允許用戶在受限制的配置文件環境中運行時控制應用程序中可用的內容類型。
系統的“設置”應用程序管理用戶控制您構建的限制的用戶界面。為了讓您的應用程序的限制設置顯示給用戶,您必須通過創建一個BroadcastReceiver接收該ACTION_GET_RESTRICTION_ENTRIES意圖來聲明您的應用程序提供的限制。系統調用這個意圖來查詢所有應用程序的可用限制,然后構建UI以允許主要用戶管理每個受限配置文件的限制。
在onReceive()你的方法中BroadcastReceiver,你必須RestrictionEntry為你的應用程序提供的每個限制創建一個。每個RestrictionEntry定義一個限制標題,說明和下列數據類型之一:
* TYPE_BOOLEAN 要么是真的要么是假的。
* TYPE_CHOICE 對于具有多個互斥選項的限制(單選按鈕選項)。
* TYPE_MULTI_SELECT對于具有多個不相互排斥的選擇的限制(復選框選項)。
然后你把所有的RestrictionEntry對象放到一個ArrayList廣播接收器的結果中作為EXTRA_RESTRICTIONS_LIST額外的值 。
系統會在“設置”應用程序中為您的應用程序的限制創建UI,并使用您為每個RestrictionEntry 對象提供的唯一鍵保存每個限制。當用戶打開您的應用程序時,您可以通過調用查詢任何當前的限制getApplicationRestrictions()。這將返回一個Bundle包含您用RestrictionEntry對象定義的每個限制的鍵值對。
如果要提供更多特定的限制,這些限制不能通過布爾值,單選項和多選項值來處理,則可以創建一個活動,用戶可以指定限制并允許用戶從限制設置中打開該活動。在您的廣播接收機中,EXTRA_RESTRICTIONS_INTENT在結果中包含額外的內容Bundle。這額外的必須指定一個Intent 指示Activity要啟動的類(使用該 putParcelable()方法來傳遞EXTRA_RESTRICTIONS_INTENT意圖)。當主用戶輸入您的活動來設置自定義限制時,您的活動必須使用EXTRA_RESTRICTIONS_LIST或EXTRA_RESTRICTIONS_BUNDLE鍵返回包含限制值的結果,這取決于您是分別指定 RestrictionEntry對象還是鍵值對。
#### **支持受限制的帳戶**
添加到主用戶的任何帳戶都可用于受限配置文件,但AccountManager默認情況下,這些帳戶無法從API 訪問。如果您嘗試AccountManager在受限個人資料中添加帳戶,則會收到失敗結果。由于這些限制,您有以下三種選擇:
允許從受限個人資料訪問所有者的帳戶。
要從受限制的配置文件訪問帳戶,您必須將該android:restrictedAccountType屬性添加到`<application>`標記中:
~~~
<application ...
android:restrictedAccountType = “com.example.account.type” >
~~~
> 警告:啟用此屬性可讓您的應用程序從受限制的配置文件訪問主用戶的帳戶。所以,只有當您的應用顯示的信息不會泄露被認為是敏感的個人身份信息(PII)時,您才應該允許這樣做。系統設置將通知主要用戶,您的應用程序會將受限制的配置文件授予其帳戶,因此用戶應該清楚,帳戶訪問權限對于您的應用程序的功能很重要。如果可能的話,您還應該為主要用戶提供足夠的限制控制,以確定您的應用允許多少帳戶訪問。
* 無法修改帳戶時禁用某些功能。
如果您想使用帳戶,但實際上并不需要這些帳戶用于您的應用程序的主要功能,則可以檢查帳戶可用性,并在不可用時禁用功能。您應該首先檢查是否有現有的帳戶可用。如果不是,那么通過調用查詢是否可以創建一個新的賬戶,getUserRestrictions()并檢查DISALLOW_MODIFY_ACCOUNTS結果中的多余部分。如果是true,那么你應該禁用你的應用程序需要訪問帳戶的任何功能。例如:
~~~
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
Bundle restrictions = um.getUserRestrictions();
if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) {
// cannot add accounts, disable some functionality
}
~~~
> 注:在這種情況下,你應該不是在你的清單文件中聲明的任何新的屬性。
* 無法訪問私人帳戶時禁用您的應用。
如果您的應用程序不適用于受限個人資料,這一點非常重要,因為您的應用程序依賴于帳戶中的敏感個人信息(還因為受限個人資料目前無法添加新帳戶),請將該android:requiredAccountType屬性添加到`<application>`標記中:
~~~
<application ...
android:requiredAccountType = “com.example.account.type” >
~~~
例如,Gmail應用程序使用此屬性為受限個人資料禁用自身,因為所有者的個人電子郵件不應用于受限個人資料。
### **無線和連接**
#### **低功耗藍牙(智能就緒)**
Android現在支持藍牙低功耗(LE)和新的API android.bluetooth。借助新的API,您可以構建可與藍牙低功耗外設(如心率監視器和計步器)進行通信的Android應用程序。
由于藍牙LE是一種在所有Android設備上都不可用的硬件功能,因此您必須在清單文件中聲明以下<uses-feature> 元素"android.hardware.bluetooth_le":
~~~
<uses-feature android:name = “android.hardware.bluetooth_le” android:required = “true” />
~~~
如果您已經熟悉Android的Classic Bluetooth API,請注意使用Bluetooth LE API有一些差異。最重要的是,現在有一個BluetoothManager類應該用于某些高級操作,例如獲取BluetoothAdapter,獲取連接設備列表以及檢查設備狀態。例如,以下是您現在應該如何獲取 BluetoothAdapter:
~~~
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
~~~
要發現藍牙LE外設,叫startLeScan()上BluetoothAdapter,它傳遞的實現BluetoothAdapter.LeScanCallback接口。當藍牙適配器檢測到藍牙LE外設時,您的BluetoothAdapter.LeScanCallback實施會接收到對該onLeScan()方法的調用 。此方法為您提供一個BluetoothDevice表示檢測到的設備的對象,設備的RSSI值以及包含設備廣告記錄的字節數組。
如果您只想掃描特定類型的外設,則可以調用startLeScan()并包含UUID指定您應用支持的GATT服務的對象數組。
> 注意:您只能掃描Bluetooth LE設備或 使用以前的API掃描Classic Bluetooth設備。您無法同時掃描LE和Classic Bluetooth設備。
然后連接到藍牙LE外圍設備,調用connectGatt()相應的 BluetoothDevice對象,傳遞給它的一個實現 BluetoothGattCallback。您的實現BluetoothGattCallback接收有關與設備的連接狀態和其他事件的回調。在onConnectionStateChange() 回調期間,如果該方法STATE_CONNECTED作為新狀態通過,則可以開始與設備進行通信。
在設備上訪問藍牙功能還要求您的應用程序請求某些藍牙用戶權限。有關更多信息,請參閱Bluetooth Low Energy API指南。
#### **Wi-Fi只掃描模式**
在嘗試識別用戶的位置時,Android可能會使用Wi-Fi通過掃描附近的接入點來確定位置。但是,用戶經常關閉Wi-Fi以節省電池,導致位置數據不準確。Android現在包括一個僅掃描模式,允許設備Wi-Fi掃描接入點以幫助獲取位置,而無需連接到接入點,從而大大降低電池使用量。
如果您想要獲取用戶的位置,但是Wi-Fi當前處于關閉狀態,則可以通過startActivity()以該操作調用來請求用戶啟用Wi-Fi只掃描模式ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE。
#### **Wi-Fi配置**
新的WifiEnterpriseConfigAPI允許面向企業的服務自動化托管設備的Wi-Fi配置。
#### **快速響應來電**
自從Android 4.0以來,一種名為“快速響應”的功能允許用戶使用即時文本消息響應來電,而無需接聽電話或解鎖設備。到目前為止,這些快速消息總是由默認的消息應用程序處理。現在,任何應用程序都可以通過為其創建一個Service 意圖過濾器來聲明其處理這些消息的能力ACTION_RESPOND_VIA_MESSAGE。
當用戶以一個快速響應來響應來電時,電話應用程序ACTION_RESPOND_VIA_MESSAGE用一個描述接收者(主叫者)的URI和EXTRA_TEXT用戶想要發送的消息的額外URI來發送意圖。當您的服務收到意圖時,它應該傳遞消息并立即停止(您的應用程序不應該顯示一個活動)。
為了獲得這個意圖,你必須聲明SEND_RESPOND_VIA_MESSAGE權限。
### **多媒體**
#### **MediaExtractor和MediaCodec增強功能**
Android現在使你更容易通過HTTP編寫自己的動態自適應流按照ISO / IEC 23009-1標準(DASH)的玩家,在使用現有的API MediaCodec和MediaExtractor。這些API的基礎架構已更新,以支持分段MP4文件的解析,但您的應用程序仍然負責解析MPD元數據并將各個流傳遞給MediaExtractor。
如果要使用加密內容的DASH,請注意該getSampleCryptoInfo()方法會返回MediaCodec.CryptoInfo描述每個加密媒體樣本結構的元數據。此外,該getPsshInfo()方法已添加到 MediaExtractor您可以訪問您的DASH媒體的PSSH元數據。此方法將UUID對象映射為字節,并 UUID指定加密方案,字節是該方案的特定數據。
#### **媒體DRM**
新的MediaDrm課程通過將DRM問題與媒體播放分離開來,為您的媒體內容提供數字版權管理(DRM)的模塊化解決方案。例如,這個API分離允許您播放Widevine加密的內容,而無需使用Widevine媒體格式。此DRM解決方案還支持DASH通用加密,因此您可以在流媒體內容中使用各種DRM方案。
您可以使用它MediaDrm來獲取不透明的密鑰請求消息,并處理來自服務器的密鑰響應消息以獲取許可證和供應。您的應用程序負責處理與服務器的網絡通信; 的MediaDrm類只提供了產生和處理信息的能力。
這些MediaDrmAPI旨在與MediaCodecAndroid 4.1(API級別16)中引入的API 一起使用 ,包括MediaCodec編碼和解碼內容,MediaCrypto處理加密內容以及MediaExtractor 提取和解復用內容。
你必須首先構造MediaExtractor和 MediaCodec對象。然后,您可以UUID通過內容中的元數據訪問DRM方案標識 ,并使用它的構造函數構造MediaDrm對象實例。
#### **來自Surface的視頻編碼**
Android 4.1(API級別16)添加了MediaCodec用于媒體內容的低級編碼和解碼的類。在對視頻進行編碼時,Android 4.1要求您為媒體提供一個ByteBuffer陣列,但現在Android 4.3允許您使用a Surface作為編碼器的輸入。例如,這可以讓您對現有視頻文件的輸入進行編碼,或使用OpenGL ES生成的幀進行編碼。
要使用Surface作為輸入到編碼器,第一個電話configure()你MediaCodec。然后打電話createInputSurface()來接收Surface您可以流媒體的信息。
例如,您可以將給定的值Surface作為OpenGL上下文的窗口eglCreateWindowSurface()。然后,在渲染曲面的同時,調用eglSwapBuffers()以將幀傳遞給MediaCodec。
為了開始編碼,撥打start()上MediaCodec。完成后,調用signalEndOfInputStream() 終止編碼,并調用release()上 Surface。
#### **Media muxing**
新MediaMuxer類可以在一個音頻流和一個視頻流之間進行復用。這些API作為MediaExtractor Android 4.2中添加的用于解復用(解復用)媒體的類的對應物。
支持的輸出格式在中定義MediaMuxer.OutputFormat。目前,MP4是唯一支持的輸出格式,并且MediaMuxer一次僅支持一個音頻流和/或一個視頻流。
MediaMuxer大多是設計來處理,MediaCodec 所以你可以通過執行視頻處理,MediaCodec然后將輸出保存到MP4文件MediaMuxer。您也可以MediaMuxer結合使用MediaExtractor來執行媒體編輯,而無需編碼或解碼。
#### **為RemoteControlClient播放進度和清理**
在Android 4.0(API等級14)中,RemoteControlClient添加了該功能以啟用遠程控制客戶端的媒體播放控制,例如鎖定屏幕上提供的控件。Android 4.3現在提供了這樣的控制器顯示回放位置和控制清除回放的能力。如果您已經使用RemoteControlClientAPI 為媒體應用程序啟用了遠程控制,則可以通過實施兩個新界面來允許播放清理。
首先,你必須FLAG_KEY_MEDIA_POSITION_UPDATE通過傳遞來啟用標志 setTransportControlsFlags()。
然后實現以下兩個新的接口:
* RemoteControlClient.OnGetPlaybackPositionListener
這包括回調onGetPlaybackPosition(),當遙控器需要更新其UI中的進度時,請求媒體的當前位置。
* RemoteControlClient.OnPlaybackPositionUpdateListener
這包括回調onPlaybackPositionUpdate(),當用戶使用遙控器UI擦洗回放時,該回調會告訴您的應用程序新媒體的時間碼。
一旦您用新的位置更新您的播放,請致電setPlaybackState()以指示新的播放狀態,位置和速度。
通過定義這些接口,您可以分別RemoteControlClient通過調用setOnGetPlaybackPositionListener()和 設置它們setPlaybackPositionUpdateListener()。
### **圖像**
#### **支持OpenGL ES 3.0**
Android 4.3增加了Java接口和本地支持OpenGL ES 3.0。OpenGL ES 3.0提供的關鍵新功能包括:
* 先進的視覺效果加速
* 高質量的ETC2 / EAC紋理壓縮作為標準功能
* 具有整數和32位浮點支持的GLSL ES著色語言的新版本
* 高級紋理渲染
* 更廣泛的標準化紋理大小和渲染緩沖區格式
Android提供了OpenGL ES 3.0的Java接口GLES30。在使用OpenGL ES 3.0時,請確保使用<uses-feature> 標記和android:glEsVersion屬性在清單文件中聲明它 。例如:
~~~
<manifest>
<uses-feature android:glEsVersion="0x00030000" />
...
</manifest>
~~~
并且記得通過調用指定OpenGL ES上下文setEGLContextClientVersion(),3作為版本傳遞。
有關使用OpenGL ES的更多信息,包括如何在運行時檢查設備支持的OpenGL ES版本,請參閱OpenGL ES API指南。
#### **可繪制的Mipmapping**
使用mipmap作為位圖或繪圖的源代碼是提供高質量圖像和各種圖像比例的簡單方法,如果您期望在動畫過程中縮放圖像,這可能特別有用。
Android 4.2(API級別17)在Bitmap 類中添加Bitmap了對mipmap的支持- 當您提供mipmap源并已啟用時,Android會交換mip圖像setHasMipMap()。現在,在Android 4.3中,您也可以BitmapDrawable通過提供mipmap資源并將該android:mipMap屬性設置為位圖資源文件或調用,為對象啟用mipmap hasMipMap()。
### **用戶界面**
#### **查看重疊**
新ViewOverlay類提供了一個透明圖層View,您可以在其上添加可視內容,而不會影響布局層次結構。你可以打電話ViewOverlay給任何View人getOverlay()。覆蓋總是和主機視圖(創建它的視圖)具有相同的大小和位置,允許您添加出現在主機視圖前面但不能擴展該主機視圖邊界的內容。
ViewOverlay當您想要創建動畫時,使用a 特別有用,例如在容器外部滑動視圖或在屏幕上移動項目而不影響視圖層次結構。但是,因為疊加層的可用區域被限制在與其主機視圖相同的區域,所以如果要為布局中移動到其位置外的視圖設置動畫效果,則必須使用具有所需布局邊界的父視圖中的疊加層。
為小部件視圖(如a)創建疊加層時Button,可以Drawable通過調用將對象添加到疊加層 add(Drawable)。如果你要求getOverlay()一個布局視圖,比如RelativeLayout返回的對象是一個ViewGroupOverlay。該 ViewGroupOverlay班是的子類ViewOverlay也允許您添加View 調用對象add(View)。
> 注意:添加到疊加層的所有可繪制和視圖只是可視化的。他們無法獲得焦點或輸入事件。
例如,以下代碼通過將視圖放置在父視圖的疊加層中,然后在該視圖上執行翻譯動畫,來動畫一個視圖向右滑動:
~~~
View view = findViewById(R.id.view_to_remove);
ViewGroup container = (ViewGroup) view.getParent();
container.getOverlay().add(view);
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight());
anim.start();
~~~
#### **光學邊界布局**
對于包含9個補丁背景圖像的視圖,您現在可以指定它們應該基于背景圖像的“光學”邊界而不是視圖的“剪輯”邊界與相鄰視圖對齊。
例如,圖1和圖2各自顯示相同的布局,但是圖1中的版本使用剪輯邊界(默認行為),而圖2使用光學邊界。由于用于按鈕和相框的九個補丁圖像包括邊緣周圍的填充,所以在使用剪輯邊界時,它們看起來不會彼此對齊或顯示為文本。
> 注意:圖1和圖2中的屏幕截圖具有“顯示布局邊界”開發者設置。對于每個視圖,紅線表示光學邊界,藍色線表示剪輯邊界,粉紅色表示邊界。
將鼠標懸停以隱藏布局邊界。

圖1.使用剪輯邊界的布局(默認)

圖2.使用光學邊界的布局
要根據光學邊界對齊視圖,請將該android:layoutMode屬性設置"opticalBounds"為父布局之一。例如:
~~~
<LinearLayout android:layoutMode="opticalBounds" ... >
~~~

圖3.帶有光學邊界的Holo按鈕9path的放大視圖。
為此,應用于視圖背景的九個補丁圖像必須使用沿九個補丁文件的底部和右側的紅線指定光學邊界(如圖3所示)。紅線表示應該從剪輯邊界中減去的區域,留下圖像的光學邊界。
當ViewGroup在布局中啟用光學邊界時,所有后代視圖將繼承光學邊界布局模式,除非通過設置android:layoutMode為覆蓋組"clipBounds"。所有的布局元素也都尊重其子視圖的光學邊界,根據視圖的光學邊界來調整它們自己的邊界。但是,布局元素(的子類ViewGroup)目前不支持應用于自己背景的九塊圖像的光學邊界。
如果通過子類創建自定義視圖View,ViewGroup或任何亞類的化合物,您的視圖將繼承這些光學約束行為。
> 注:由全息主題支持的所有部件已與光學界,包括更新Button, Spinner, EditText,等。所以,你可以立即被設定受益 android:layoutMode屬性"opticalBounds",如果您的應用程序適用于一個霍洛主題(Theme.Holo,Theme.Holo.Light,等)。
要使用Draw 9-patch工具為自己的九分圖像指定光學邊界,請在單擊邊框像素時按住Ctrl鍵。
#### **Rect值的動畫**
您現在可以Rect使用新的動畫在兩個值之間進行動畫RectEvaluator。這個新類是TypeEvaluator你可以傳遞給它的一個實現ValueAnimator.setEvaluator()。
#### **窗口附加和焦點偵聽器**
以前,如果您想要聽取何時將視圖附加到/分離到窗口或其焦點發生了變化,您需要重寫View要實現的類onAttachedToWindow()和onDetachedFromWindow()/或 onWindowFocusChanged()。
現在,要接收附加和分離事件,您可以實現ViewTreeObserver.OnWindowAttachListener并將其設置在視圖上 addOnWindowAttachListener()。為了接收焦點事件,你可以ViewTreeObserver.OnWindowFocusChangeListener用一個視圖來實現和設置它 addOnWindowFocusChangeListener()。
#### **電視過掃描支持**
為了確保您的應用程序在每臺電視機上都能顯示整個屏幕,現在可以為您的應用程序布局啟用過掃描。過掃描模式由FLAG_LAYOUT_IN_OVERSCAN標志確定,您可以使用平臺主題啟用標志,例如 Theme_DeviceDefault_NoActionBar_Overscan啟用windowOverscan自定義主題中的 樣式。
#### **屏幕方向**
該`<activity>` 標簽的screenOrientation 屬性現在支持附加值來遵守用戶對自動旋轉的偏好:
* "userLandscape"
行為相同"sensorLandscape",除非用戶禁用自動旋轉,那么它鎖定在正常的橫向,不會翻轉。
* "userPortrait"
行為相同"sensorPortrait",除非用戶禁用自動旋轉,然后鎖定在正常的縱向方向,不會翻轉。
* "fullUser"
"fullSensor"與所有四個方向的行為相同,并允許旋轉,除非用戶禁用自動旋轉,然后鎖定用戶的首選方向。
此外,您現在還可以聲明"locked"將應用的方向鎖定到屏幕的當前方向。
#### **旋轉動畫**
新的rotationAnimation字段 WindowManager允許您在系統切換屏幕方向時選擇要使用的三種動畫之一。這三個動畫是:
* ROTATION_ANIMATION_CROSSFADE
* ROTATION_ANIMATION_JUMPCUT
* ROTATION_ANIMATION_ROTATE
> 注意:只有在您將活動設置為使用“全屏”模式時,才可以使用這些動畫Theme.Holo.NoActionBar.Fullscreen。
例如,以下是如何啟用“淡入淡出”動畫:
~~~
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
getWindow().setAttributes(params);
...
}
~~~
### **用戶輸入**
#### **新的傳感器類型**
新的TYPE_GAME_ROTATION_VECTOR傳感器可以讓您檢測設備的旋轉,而不用擔心磁干擾。與TYPE_ROTATION_VECTOR傳感器不同,TYPE_GAME_ROTATION_VECTOR它不是基于磁性北極。
新的TYPE_GYROSCOPE_UNCALIBRATED和TYPE_MAGNETIC_FIELD_UNCALIBRATED傳感器提供原始的傳感器數據,而不考慮偏差估計。也就是說,現有的TYPE_GYROSCOPE和TYPE_MAGNETIC_FIELD 傳感器提供的傳感器數據分別考慮了陀螺漂移和設備中硬鐵的估計偏差。而這些傳感器的新“未校準”版本則提供原始傳感器數據,并分別提供估計偏差值。這些傳感器允許您通過增加外部數據的估計偏差來為傳感器數據提供您自己的定制校準。
#### **通知監聽器**
Android 4.3添加了一個新的服務類,NotificationListenerService允許您的應用程序接收系統發布的新通知的相關信息。
如果您的應用當前使用輔助功能服務API訪問系統通知,則應該更新您的應用以使用這些API。
#### **聯系人提供商**
#### **查詢“可聯系人”**
新的“聯系人提供者”查詢Contactables.CONTENT_URI提供了一種有效的方法,可以獲取Cursor包含與指定查詢匹配的所有聯系人的所有電子郵件地址和電話號碼的聯系人。
#### **查詢聯系人增量**
新的API已添加到聯系人提供程序,使您可以有效地查詢聯系人數據的最近更改。以前,當聯系人數據中的某些內容發生變化時,可能會通知您的應用程序,但是您不知道發生了什么變化,并且需要檢索所有聯系人,然后遍歷它們以發現變化。
要跟蹤對插入和更新的更改,現在可以在CONTACT_LAST_UPDATED_TIMESTAMP選擇時包含參數,以僅查詢自上次查詢提供者以來發生更改的聯系人。
要跟蹤哪些聯系人已被刪除,新表ContactsContract.DeletedContacts提供已刪除聯系人的日志(但刪除的每個聯系人在此表中保留有限的時間)。與之類似CONTACT_LAST_UPDATED_TIMESTAMP,您可以使用新的選擇參數CONTACT_DELETED_TIMESTAMP來檢查自上次查詢提供者以來哪些聯系人已被刪除。該表還包含包含DAYS_KEPT_MILLISECONDS日志將保留的天數(以毫秒為單位)的常量。
另外,CONTACTS_DATABASE_CREATED當用戶通過系統設置菜單清除聯系人存儲時,聯系人提供者現在廣播該動作,有效地重新創建聯系人提供者數據庫。它旨在表示他們需要放棄所有存儲的聯系信息,并重新加載新的查詢。
有關使用這些API檢查聯系人更改的示例代碼,請查看SDK示例下載中提供的ApiDemos示例。
### **本土化**
#### **改進了對雙向文本的支持**
以前版本的Android支持從右向左(RTL)語言和布局,但有時不能正確處理混合方向的文本。因此,Android 4.3增加了BidiFormatterAPI,可以幫助您正確地設置具有相反方向內容的文本,而不會混淆其中的任何部分。
例如,當你想創建一個帶有字符串變量的句子,比如“你的意思是15 Bay Street,Laurel,CA?”時,你通常會傳遞一個本地化的字符串資源和變量 String.format():
~~~
Resources res = getResources();
String suggestion = String.format(res.getString(R.string.did_you_mean), address);
~~~
但是,如果語言環境是希伯來語,那么格式化的字符串就像這樣出來:
你的意思是15灣街,勞雷爾,加州?
這是錯誤的,因為“灣街”應該留下“15”。解決方案是使用BidiFormatter和它的unicodeWrap()方法。例如,上面的代碼變成:
~~~
Resources res = getResources();
BidiFormatter bidiFormatter = BidiFormatter.getInstance();
String suggestion = String.format(res.getString(R.string.did_you_mean),
bidiFormatter.unicodeWrap(address));
~~~
默認情況下,unicodeWrap()使用第一個強方向性估計啟發式,如果文本方向的第一個信號不能代表整個內容的合適方向,則可能會出錯。如果有必要,你可以通過傳遞一個指定不同的啟發式TextDirectionHeuristic常數從TextDirectionHeuristics 到unicodeWrap()。
> 注意:這些新的API也可通過Android 支持庫以及BidiFormatter類和相關的API 用于以前版本的Android 。
### **無障礙服務**
#### **處理關鍵事件**
一個AccessibilityService現在可以接收按鍵輸入事件的回調onKeyEvent()回調方法。這使得您的輔助功能服務可以處理鍵盤輸入設備(如鍵盤)的輸入,并將這些事件轉換為以前可能只能通過觸摸輸入或設備的方向鍵才能進行的特殊操作。
#### **選擇文本并復制/粘貼**
在AccessibilityNodeInfo現在提供的API,允許AccessibilityService在一個節點來選擇,剪切,復制和粘貼文本。
要指定文本剪切或復制的選擇,您可訪問服務可以使用新的動作,ACTION_SET_SELECTION與它通過選擇開始和結束位置ACTION_ARGUMENT_SELECTION_START_INT和ACTION_ARGUMENT_SELECTION_END_INT。或者,您可以通過使用現有操作來操作光標位置來選擇文本ACTION_NEXT_AT_MOVEMENT_GRANULARITY (之前僅用于移動光標位置),并添加參數ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN。
然后,您可以剪切或復制用ACTION_CUT, ACTION_COPY,再后來用粘貼 ACTION_PASTE。
> 注意:這些新的API也可以通過Android 支持庫與以前版本的Android 一起使用AccessibilityNodeInfoCompat 。
#### **聲明可訪問性功能**
從Android 4.3開始,可訪問性服務必須在其元數據文件中聲明可訪問性功能,以便使用某些輔助功能。如果在元數據文件中沒有請求功能,則該功能將是無操作的。要聲明服務的可訪問性功能,必須使用與AccessibilityServiceInfo 該類中的各種“能力”常量相對應的XML屬性。
例如,如果一個服務沒有請求這個flagRequestFilterKeyEvents能力,那么它將不會收到關鍵事件。
### **測試和調試**
#### **自動UI測試**
新的UiAutomation類提供了API,允許您模擬用戶的測試自動化操作。通過使用平臺的AccessibilityServiceAPI,UiAutomation API允許您檢查屏幕內容并注入任意的鍵盤和觸摸事件。
獲取一個實例UiAutomation,調用Instrumentation.getUiAutomation()。為了使這個工作,你必須提供-w選項與instrument運行你的InstrumentationTestCase從命令adb shell。
使用該UiAutomation實例,可以執行任意事件來通過調用來測試您的應用程序executeAndWaitForEvent(),將其傳遞Runnable給執行,操作的超時時間以及UiAutomation.AccessibilityEventFilter接口的實現。在您的UiAutomation.AccessibilityEventFilter實現中,您會收到一個調用,允許您篩選感興趣的事件,并確定給定測試用例的成功或失敗。
要觀察測試過程中的所有事件,請創建一個實現UiAutomation.OnAccessibilityEventListener并將其傳遞給setOnAccessibilityEventListener()。您的監聽器接口隨后會在onAccessibilityEvent() 每次發生事件時接收一個調用,接收AccessibilityEvent描述該事件的對象。
UiAutomationAPI在很低的級別上提供了各種各樣的其他操作來鼓勵UI測試工具(例如uiautomator)的開發。比如, UiAutomation也可以:
* 注入輸入事件
* 改變屏幕的方向
* 截圖
而對于UI測試工具來說,最重要的是,這些UiAutomationAPI跨越應用程序界限工作,不像那些API Instrumentation。
#### **Systrace事件的應用程序**
Android 4.3為這個Trace類添加了兩個靜態方法, beginSection()并endSection()允許你定義包含systrace報告的代碼塊。通過在您的應用程序中創建可追蹤代碼的部分,systrace日志將為您提供更詳細的分析,了解您的應用程序在哪里出現放緩。
有關使用Systrace工具的信息,請閱讀使用Systrace 分析顯示和性能。
#### **安全**
#### **應用程序專用密鑰的Android密鑰存儲區**
Android現在在KeyStore 工具中提供了一個名為Android Key Store 的自定義Java安全提供程序,它允許您生成并保存可能僅被您的應用程序查看和使用的私鑰。加載Android密鑰庫,傳遞 "AndroidKeyStore"給KeyStore.getInstance()。
要在Android Key Store中管理您的應用程序的私人憑據,請使用KeyPairGeneratorwith 生成一個新的密鑰 KeyPairGeneratorSpec。首先KeyPairGenerator通過調用來獲得一個實例getInstance()。然后調用 initialize(),傳遞一個KeyPairGeneratorSpec你可以使用 的實例 KeyPairGeneratorSpec.Builder。最后,KeyPair通過打電話給你generateKeyPair()。
#### **硬件憑證存儲**
Android現在還支持硬件支持存儲KeyChain 憑據,通過使密鑰不可用于提取更安全。也就是說,一旦密鑰位于硬件支持的密鑰存儲區(安全元件,TPM或TrustZone)中,它們就可以用于加密操作,但不能導出私有密鑰材料。即使OS內核也無法訪問這個密鑰材料。雖然并非所有基于Android的設備都支持硬件上的存儲,但您可以在運行時檢查硬件支持的存儲是否可以通過調用進行訪問 KeyChain.IsBoundKeyAlgorithm()。
#### **清單聲明**
#### **可申報的必需功能**
<uses-feature> 元素現在支持以下值,因此您可以確保您的應用僅安裝在提供您應用所需功能的設備上。
* FEATURE_APP_WIDGETS
聲明您的應用程序提供了應用程序小部件,并且應該只安裝在包含主屏幕或用戶可以嵌入應用程序小部件的類似位置的設備上。例:
~~~
<uses-feature android:name = “android.software.app_widgets” android:required = “true” />
~~~
* FEATURE_HOME_SCREEN
聲明您的應用程序表現為主屏幕替換,并且應該只安裝在支持第三方主屏幕應用程序的設備上。例:
~~~
<uses-feature android:name="android.software.home_screen" android:required="true" />
~~~
* FEATURE_INPUT_METHODS
聲明您的應用程序提供自定義輸入法(使用鍵盤構建InputMethodService),并且應該只安裝在支持第三方輸入法的設備上。例:
~~~
<uses-feature android:name="android.software.input_methods" android:required="true" />
~~~
* FEATURE_BLUETOOTH_LE
聲明您的應用程序使用藍牙低功耗API,并且應該只安裝在能夠通過藍牙低功耗與其他設備進行通信的設備上。例:
~~~
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
~~~
### **用戶權限**
現在支持以下值<uses-permission> 來聲明您的應用程序訪問某些API所需的權限。
* BIND_NOTIFICATION_LISTENER_SERVICE
需要使用新的NotificationListenerServiceAPI。
* SEND_RESPOND_VIA_MESSAGE
需要接收ACTION_RESPOND_VIA_MESSAGE 意圖。
有關Android 4.3中所有API更改的詳細視圖,請參閱 API差異報告。
- 前言
- 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
- 培訓