### **[Android 7.0 行為變更](https://developer.android.com/about/versions/nougat/android-7.0-changes.html)**
### **本文內容**
* **API 差異**
[API 23 至 API 24](https://developer.android.com/sdk/api_diff/24/changes.html)
* **另請參閱**
[Android 7.0 開發者版本](https://developer.android.com/about/versions/nougat/android-7.0.html)
Android 7.0 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。本文重點介紹您應該了解并在開發應用時加以考慮的一些主要變更。
如果您之前發布過 Android 應用,請注意您的應用可能受到這些平臺變化的影響。
### **電池和內存**
Android 7.0 包括旨在延長設備電池壽命和減少 RAM 使用的系統行為變更。這些變更可能會影響您的應用訪問系統資源,以及您的應用通過特定隱式 intent 與其他應用交互的方式。
#### **低電耗模式**
Android 6.0(API 級別 23)引入了低電耗模式,當用戶設備未插接電源、處于靜止狀態且屏幕關閉時,該模式會推遲 CPU 和網絡活動,從而延長電池壽命。而 Android 7.0 則通過在設備未插接電源且屏幕關閉狀態下、但不一定要處于靜止狀態(例如用戶外出時把手持式設備裝在口袋里)時應用部分 CPU 和網絡限制,進一步增強了低電耗模式。

圖 1. 低電耗模式如何應用第一級系統活動限制以延長電池壽命的圖示。
當設備處于充電狀態且屏幕已關閉一定時間后,設備會進入低電耗模式并應用第一部分限制:關閉應用網絡訪問、推遲作業和同步。如果進入低電耗模式后設備處于靜止狀態達到一定時間,系統則會對 PowerManager.WakeLock、AlarmManager 鬧鈴、GPS 和 WLAN 掃描應用余下的低電耗模式限制。無論是應用部分還是全部低電耗模式限制,系統都會喚醒設備以提供簡短的維護時間窗口,在此窗口期間,應用程序可以訪問網絡并執行任何被推遲的作業/同步。

圖 2. 低電耗模式如何在設備處于靜止狀態達到一定時間后應用第二級系統活動限制的圖示。
請注意,激活屏幕或插接設備電源時,系統將退出低電耗模式并移除這些處理限制。此項新增的行為不會影響有關使您的應用適應 Android 6.0(API 級別 23)中所推出的舊版本低電耗模式的建議和最佳做法,如對低電耗模式和應用待機模式進行針對性優化中所討論。您仍應遵循這些建議(例如使用 Google 云消息傳遞 (GCM) 發送和接收消息)并開始安排更新計劃以適應新增的低電耗模式行為。
#### **Project Svelte:后臺優化**
Android 7.0 移除了三項隱式廣播,以幫助優化內存使用和電量消耗。此項變更很有必要,因為隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應用。刪除這些廣播可以顯著提升設備性能和用戶體驗。
移動設備會經歷頻繁的連接變更,例如在 WLAN 和移動數據之間切換時。目前,可以通過在應用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播,讓應用能夠監控這些變更。由于很多應用會注冊接收此廣播,因此單次網絡切換即會導致所有應用被喚醒并同時處理此廣播。
同理,在之前版本的 Android 中,應用可以注冊接收來自其他應用(例如相機)的隱式 ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 廣播。當用戶使用相機應用拍攝照片時,這些應用即會被喚醒以處理廣播。
為緩解這些問題,Android 7.0 應用了以下優化措施:
* 面向 Android 7.0 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前臺運行的應用如果使用 BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
* 應用無法發送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。
如果您的應用使用任何 intent,您仍需要盡快移除它們的依賴關系,以正確適配 Android 7.0 設備。Android 框架提供多個解決方案來緩解對這些隱式廣播的需求。例如,JobScheduler API 提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無限流量網絡)時所執行的網絡操作。您甚至可以使用 JobScheduler 來適應內容提供程序變化。
如需了解有關 Android N 中后臺優化以及如何改寫應用的詳細信息,請參閱后臺優化。
### **權限更改**
Android 7.0 做了一些權限更改,這些更改可能會影響您的應用。
#### **系統權限更改**
為了提高私有文件的安全性,面向 Android 7.0 或更高版本的應用私有目錄被限制訪問 (0700)。此設置可防止私有文件的元數據泄漏,如它們的大小或存在性。此權限更改有多重副作用:
* 私有文件的文件權限不應再由所有者放寬,為使用 MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 而進行的此類嘗試將觸發 SecurityException。
> 注:迄今為止,這種限制尚不能完全執行。應用仍可能使用原生 API 或 File API 來修改它們的私有目錄權限。但是,我們強烈反對放寬私有目錄的權限。
* 傳遞軟件包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。分享私有文件內容的推薦方法是使用 FileProvider。
* DownloadManager 不再按文件名分享私人存儲的文件。舊版應用在訪問 COLUMN_LOCAL_FILENAME 時可能出現無法訪問的路徑。面向 Android 7.0 或更高版本的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。通過使用 DownloadManager.Request.setDestinationInExternalFilesDir() 或 DownloadManager.Request.setDestinationInExternalPublicDir() 將下載位置設置為公共位置的舊版應用仍可以訪問 COLUMN_LOCAL_FILENAME 中的路徑,但是我們強烈反對使用這種方法。對于由 DownloadManager 公開的文件,首選的訪問方式是使用ContentResolver.openFileDescriptor()。
### **在應用間共享文件**
對于面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,并出現 FileUriExposedException 異常。
要在應用間共享文件,您應發送一項 content:// URI,并授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。如需了解有關權限和共享文件的詳細信息,請參閱共享文件。
### **無障礙改進**
為提高平臺對于視力不佳或視力受損用戶的易用性,Android 7.0 做出了一些更改。這些更改一般并不要求更改您的應用代碼,不過您應仔細檢查并使用您的應用測試這些功能,以評估它們對用戶體驗的潛在影響。
#### **屏幕縮放**
Android 7.0 支持用戶設置顯示尺寸,以放大或縮小屏幕上的所有元素,從而提升設備對視力不佳用戶的可訪問性。用戶無法將屏幕縮放至低于最小屏幕寬度 sw320dp,該寬度是 Nexus 4 的寬度,也是常規中等大小手機的寬度。

圖 3. 右側屏幕顯示的是一臺運行 Android 7.0 系統映像的設備增大顯示尺寸后的效果。
當設備密度發生更改時,系統會以如下方式通知正在運行的應用:
* 如果是面向 API 級別 23 或更低版本系統的應用,系統會自動終止其所有后臺進程。這意味著如果用戶切換離開此類應用,轉而打開 Settings 屏幕并更改 Display size 設置,則系統會像處理內存不足的情況一樣終止該應用。如果應用具有任何前臺進程,則系統會如處理運行時更改中所述將配置變更通知給這些進程,就像對待設備屏幕方向變更一樣。
* 如果是面向 Android 7.0 的應用,則其所有進程(前臺和后臺)都會收到有關配置變更的通知,如處理運行時更改中所述。
大多數應用并不需要進行任何更改即可支持此功能,不過前提是這些應用遵循 Android 最佳做法。具體要檢查的事項:
* 在屏幕寬度為 sw320dp 的設備上測試您的應用,并確保其充分運行。
* 當設備配置發生變更時,更新任何與密度相關的緩存信息,例如緩存位圖或從網絡加載的資源。當應用從暫停狀態恢復運行時,檢查配置變更。
> 注:如果您要緩存與配置相關的數據,則最好也包括相關元數據,例如該數據對應的屏幕尺寸或像素密度。保存這些元數據便于您在配置變更后決定是否需要刷新緩存數據。
* 避免用像素單位指定尺寸,因為像素不會隨屏幕密度縮放。應改為使用與密度無關像素 (dp) 單位指定尺寸。
#### **設置向導中的視覺設置**
Android 7.0 在“Welcome”屏幕中加入了“Vision Settings”,用戶可以在新設備上設置以下無障礙功能設置:Magnification gesture、Font size、Display size 和話語提示。此項變更讓您可以更容易發現與不同屏幕設置有關的錯誤。要評估此功能的影響,您應在啟用這些設置的狀態下測試應用。您可以在 Settings > Accessibility 中找到這些設置。
### **NDK 應用鏈接至平臺庫**
從 Android 7.0 開始,系統將阻止應用動態鏈接非公開 NDK 庫,這種庫可能會導致您的應用崩潰。此行為變更旨在為跨平臺更新和不同設備提供統一的應用體驗。即使您的代碼可能不會鏈接私有庫,但您的應用中的第三方靜態庫可能會這么做。因此,所有開發者都應進行相應檢查,確保他們的應用不會在運行 Android 7.0 的設備上崩潰。如果您的應用使用原生代碼,則只能使用公開 NDK API。
您的應用可通過以下三種方式嘗試訪問私有平臺 API:
* 您的應用直接訪問私有平臺庫。您應更新您的應用以添加該應用的庫副本,或使用公開 NDK API。
* 您的應用使用一個可訪問私有平臺庫的第三方庫。即使您確定您的應用不會直接訪問私有庫,您仍應針對此情景測試您的應用。
* 您的應用引用一個其 APK 中未包含的庫。例如,如果您嘗試使用您自己的 OpenSSL 副本,但忘記將它與應用的 APK 進行捆綁,則可能會出現此情況。正常情況下,此應用可在包含 libcrypto.so 的 Android 平臺版本上運行。不過,此應用在不包含此庫的新版 Android(例如,Android 6.0 和更高的版本)上會崩潰。為修復此問題,請確保您的 APK 捆綁您的所有非 NDK 庫。
應用不應使用 NDK 中未包含的原生庫,因為這些庫可能會發生更改或在不同 Android 版本之間的可用性不同。例如,從 OpenSSL 切換至 BoringSSL 即屬于此類更改。此外,由于不屬于 NDK 中的平臺庫沒有兼容性要求,因此不同的設備可能提供不同級別的兼容性。
為降低此限制可能對當前發布的應用的影響,面向 API 級別 23 或更低級別的應用在 Android N 上可暫時訪問頗為常用的一組庫,例如 libandroid_runtime.so、libcutils.so、libcrypto.so 和 libssl.so。如果您的應用加載其中某個庫,logcat 會生成一個警告,并在目標設備上顯示一個 Toast 來通知您。如果您看到這些警告,您應更新您的應用以添加該應用自己的庫副本,或僅使用公開 NDK API。將來發布的 Android 平臺可能會完全限制對私有庫的使用,并導致您的應用崩潰。
所有應用在調用既非公開又不可暫時訪問的 API 時都會生成一個運行時錯誤。結果就是 System.loadLibrary 和 dlopen(3) 同時返回 NULL,并可能導致您的應用崩潰。您應檢查應用代碼以移除對私有平臺 API 的使用,并使用預覽版設備或模擬器全面測試應用。如果您不確定您的應用是否使用私有庫,您可以檢查 logcat 以識別運行時錯誤。
下表描述的是根據應用使用的私有原生庫及其目標 API 級別 (android:targetSdkVersion),應用預期顯示的行為。

#### **檢查您的應用是否使用私有庫**
為幫助您識別加載私有庫的問題,logcat 可能會生成一個警告或運行時錯誤。例如,如果您的應用面向 API 級別 23 或更低級別,并在運行 Android 7.0 的設備上嘗試訪問私有庫,您可能會看到一個類似于下面所示的警告:
~~~
03-21 17:07:51.502 31234 31234 W linker : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120
~~~
這些 logcat 警告通知您哪個庫正在嘗試訪問私有平臺 API,但不會導致您的應用崩潰。但是,如果應用面向 API 級別 24 或更高級別,logcat 會生成以下運行時錯誤,您的應用可能會崩潰:
~~~
java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:977)
at java.lang.System.loadLibrary(System.java:1602)
~~~
如果您的應用使用動態鏈接到私有平臺 API 的第三方庫,您可能也會看到上述 logcat 輸出。利用 Android 7.0DK 中的 readelf 工具,您可以通過運行以下命令生成給定 .so 文件的所有動態鏈接的共享庫列表:
~~~
aarch64-linux-android-readelf -dW libMyLibrary.so
~~~
#### **更新您的應用**
通過下面的一些步驟,您可以修復上述類型的錯誤并確保您的應用不會在將來的更新版平臺上崩潰:
* 如果您的應用使用私有平臺庫,您應更新它,以添加該應用自己的庫副本或使用公開 NDK API。
* 如果您的應用使用訪問私有符號的第三方庫,則聯系庫作者以更新庫。
* 請確保將您的所有非 NDK 庫與您的 APK 打包在一起。
* 使用標準 JNI 函數而非來自 libandroid_runtime.so 的 getJavaVM 和 getJNIEnv:
~~~
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>.
~~~
* 使用 __system_property_get 而非來自 libcutils.so 的私有 property_get 符號。為此,請使用 __system_property_get 及以下 include 函數:
~~~
#include <sys/system_properties.h>
~~~
> 注:系統屬性的可用性和內容未通過 CTS 進行測試。應執行進一步修復以避免同時使用這些屬性。
* 使用來自 libcrypto.so 的 SSL_ctrl 符號的本地版本。例如,您應在您的 .so 文件中靜態鏈接 libcyrpto.a,或從 BoringSSL/OpenSSL 添加一個動態鏈接的 libcrypto.so 版本,并將其打包到您的 APK 中。
### **Android for Work**
Android 7.0 包含一些針對面向 Android for Work 的應用的變更,包括對證書安裝、密碼重置、二級用戶管理、設備標識符訪問權限的變更。如果您是要針對 Android for Work 環境開發應用,則應仔細檢查這些變更并相應地修改您的應用。
* 您必須先安裝授權證書安裝程序,然后 DPC 才能對其進行設置。對于面向 N SDK 的配置文件和設備所有者應用,您應在設備規范控制器 (DPC) 調用 DevicePolicyManager.setCertInstallerPackage() 之前安裝授權證書安裝程序。如果尚未安裝此安裝程序,則系統會引發 IllegalArgumentException。
* 針對設備管理員的重置密碼限制現在也適用于配置文件所有者。設備管理員無法再使用 DevicePolicyManager.resetPassword() 來清除或更改已經設置的密碼。設備管理員仍可以設置密碼,但只能在設備沒有密碼、PIN 碼或圖案時這樣做。
* 即使設置了限制,設備所有者和配置文件所有者仍可以管理帳戶。而且,即使具有 DISALLOW_MODIFY_ACCOUNTS 用戶限制,設備所有者和配置文件所有者仍可調用 Account Management API。
* 設備所有者可以更輕松地管理二級用戶。當設備在設備所有者模式下運行時,系統將自動設置 DISALLOW_ADD_USER 限制。這樣可以防止用戶創建非托管二級用戶。此外,CreateUser() 和 createAndInitializeUser() 方法已棄用,取而代之的是 DevicePolicyManager.createAndManageUser() 方法。
* 設備所有者可以訪問設備標識符。設備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress() 訪問設備的 WLAN MAC 地址。如果設備上從未啟用 WLAN,則此方法將返回一個 null 值。
* 工作模式設置控制工作應用訪問。當工作模式關閉時,系統啟動器通過使工作應用顯示為灰色來指示它們不可用。啟用工作模式會再次恢復正常行為。
* 從 Settings UI 安裝包含客戶端證書鏈和對應的私鑰的 PKCS #12 文件時,系統不再將該證書鏈中的 CA 證書安裝到受信任的憑據存儲空間。當應用稍后嘗試檢索客戶端證書鏈時,這不會影響 KeyChain.getCertificateChain() 的結果。如果需要,使用 .crt 或 .cer 文件擴展名的 DER 編碼格式通過 Settings UI 單獨將 CA 證書安裝到受信任的憑據存儲空間。
* 從 Android 7.0 開始,可針對每個用戶管理指紋登記和存儲空間。如果配置文件所有者的設備規范客戶端 (DPC) 面向 Android N 設備上的 Android N 之前的版本,則用戶仍可以在該設備上設置指紋,但工作應用不能訪問設備指紋。當 DPC 面向 Android N 和更高版本時,用戶可以通過轉到 Settings > Security > Work profile security 專門為托管配置文件設置指紋。
* DevicePolicyManager.getStorageEncryptionStatus() 返回新的加密狀態 ENCRYPTION_STATUS_ACTIVE_PER_USER,以表明加密處于活動狀態,且加密密鑰與用戶關聯。僅當 DPC 面向 API 級別 24 和更高級別時才會返回新的狀態。對于面向更早的 API 級別的應用,即使加密密鑰是用戶或配置文件特有的,系統也會返回 ENCRYPTION_STATUS_ACTIVE。
* 在 Android 7.0 中,如果設備通過單獨的工作挑戰安裝了托管配置文件,則原本通常會影響整個設備的多個方法將會改變其行為方式。這些方法將僅應用于托管配置文件,而不是影響整個設備。(此類方法的完整列表位于 DevicePolicyManager.getParentProfileInstance() 文檔中。)例如,DevicePolicyManager.lockNow() 只鎖定托管配置文件,而不是鎖定整個設備。對于上述每個方法,您可以通過對 DevicePolicyManager 的父實例調用該方法來獲取以前的行為;您可以通過調用 DevicePolicyManager.getParentProfileInstance() 獲取此父項。例如,如果您調用父實例的 lockNow() 方法,則整個設備將被鎖定。
如需了解有關 Android 7.0 中針對 Android for Work 所做變更的詳細信息,請參閱 [Android for Work 更新](https://developer.android.com/preview/features/afw.html)。
### **注解保留**
Android 7.0 修復了一個注解可見性被忽略的錯誤。這種問題會導致應用可在運行時訪問原本不允許訪問的注解。這些注解包括:
* VISIBILITY_BUILD:僅應編譯時可見。
* VISIBILITY_SYSTEM:運行時應可見,但僅限底層系統。
如果您的應用依賴這種行為,請為運行時必須可用的注解添加保留政策。您可通過使用@Retention(RetentionPolicy.RUNTIME) 來執行此操作。
### **其他重要說明**
* 如果一個應用在 Android 7.0 上運行,但卻是針對更低 API 級別開發的,那么在用戶更改顯示尺寸時,系統將終止此應用進程。應用必須能夠妥善處理此情景。否則,當用戶從最近使用記錄中恢復運行應用時,應用將會出現崩潰現象。
您應測試應用以確保不會發生此行為。要進行此測試,您可以通過 DDMS 手動終止應用,以造成相同的崩潰現象。
在密度發生更改時,系統不會自動終止面向 N 及更高版本的應用;不過,這些應用仍可能對配置變更做出不良響應。
* Android 7.0 上的應用應能夠妥善處理配置變更,并且在后續啟動時不會出現崩潰現象。您可以通過更改字體大小 (Setting >Display > Font size) 并隨后從最近使用記錄中恢復運行應用,來驗證應用行為。
* 由于之前的 Android 版本中的一項錯誤,系統未能將對主線程上的一個 TCP 套接字的寫入操作舉報為違反嚴格模式。Android 7.0 修復了此錯誤。呈現出這種行為的應用現在會引發 android.os.NetworkOnMainThreadException。一般情況下,我們不建議在主線程上執行網絡操作,因為這些操作通常會出現可能導致 ANR 和卡頓的高尾延遲。
* Debug.startMethodTracing() 方法系列現在默認在您的共享存儲空間上的軟件包特定目錄中存儲輸出,而非 SD 卡根目錄。這意味著應用不再需要請求 WRITE_EXTERNAL_STORAGE 權限來使用這些 API 。
* 許多平臺 API 現在開始檢查在 Binder 事務間發送的大負載,系統現在會將 TransactionTooLargeExceptions 作為 RuntimeExceptions 再次引發,而不再只是默默記錄或抑制它們。一個常見例子是在 Activity.onSaveInstanceState() 上存儲過多數據,導致 ActivityThread.StopInfo 在您的應用面向 Android 7.0 時引發 RuntimeException。
* 如果應用向 View 發布 Runnable 任務,并且 View 未附加到窗口,系統會用 View 為 Runnable 任務排隊;在 View 附加到窗口之前,不會執行 Runnable 任務。此行為會修復以下錯誤:
* 如果一項應用是從并非預期窗口 UI 線程的其他線程發布到 View,則 Runnable 可能會因此運行錯誤的線程。
* 如果 Runnable 任務是從并非環路線程的其他線程發布,則應用可能會曝光 Runnable 任務。
* 如果 Android 7.0 上一項有 DELETE_PACKAGES 權限的應用嘗試刪除一個軟件包,但另一項應用已經安裝了這個軟件包,則系統需要用戶進行確認。在這種情況下,應用在調用 PackageInstaller.uninstall() 時預計的返回狀態應為 STATUS_PENDING_USER_ACTION。
* 名為 Crypto 的 JCA 提供程序已棄用,因為它僅有的 SHA1PRNG 算法為弱加密。應用無法再使用 SHA1PRNG(不安全地)派生密鑰,因為不再提供此提供程序。如需了解詳細信息,請參閱博文 [Android N 中已棄用“Crypto”安全提供程序](http://android-developers.blogspot.com/2016/06/security-crypto-provider-deprecated-in.html)。
- 前言
- 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
- 培訓